Add User.delete.
This commit is contained in:
parent
d4f5a196b9
commit
5b42882f70
2 changed files with 59 additions and 0 deletions
|
@ -130,6 +130,9 @@ class TagTooShort(EtiquetteException):
|
||||||
class AlreadySignedIn(EtiquetteException):
|
class AlreadySignedIn(EtiquetteException):
|
||||||
error_message = 'You\'re already signed in.'
|
error_message = 'You\'re already signed in.'
|
||||||
|
|
||||||
|
class CantDeleteUser(EtiquetteException):
|
||||||
|
error_message = '{} can\'t be deleted because they still have possessions.'
|
||||||
|
|
||||||
class InvalidPassword(EtiquetteException):
|
class InvalidPassword(EtiquetteException):
|
||||||
error_message = 'Password is invalid.'
|
error_message = 'Password is invalid.'
|
||||||
|
|
||||||
|
|
|
@ -1693,6 +1693,42 @@ class User(ObjectBase):
|
||||||
|
|
||||||
return display_name
|
return display_name
|
||||||
|
|
||||||
|
def _uncache(self):
|
||||||
|
self.photodb.caches['user'].remove(self.id)
|
||||||
|
|
||||||
|
@decorators.required_feature('user.edit')
|
||||||
|
@decorators.transaction
|
||||||
|
def delete(self, *, disown_authored_things):
|
||||||
|
'''
|
||||||
|
If disown_authored_things is True, then all of this user's albums,
|
||||||
|
bookmarks, photos, and tags will have their author_id set to None.
|
||||||
|
|
||||||
|
If disown_authored_things is False, and the user has any belongings,
|
||||||
|
exceptions.CantDeleteUser is raised.
|
||||||
|
|
||||||
|
You should delete those objects first. Since each object type has
|
||||||
|
different options while deleting, that functionality is not provided
|
||||||
|
here.
|
||||||
|
'''
|
||||||
|
if disown_authored_things:
|
||||||
|
pairs = {'author_id': (self.id, None)}
|
||||||
|
self.photodb.sql_update(table='albums', pairs=pairs, where_key='author_id')
|
||||||
|
self.photodb.sql_update(table='bookmarks', pairs=pairs, where_key='author_id')
|
||||||
|
self.photodb.sql_update(table='photos', pairs=pairs, where_key='author_id')
|
||||||
|
self.photodb.sql_update(table='tags', pairs=pairs, where_key='author_id')
|
||||||
|
else:
|
||||||
|
fail = (
|
||||||
|
self.has_any_albums() or
|
||||||
|
self.has_any_bookmarks() or
|
||||||
|
self.has_any_photos() or
|
||||||
|
self.has_any_tags()
|
||||||
|
)
|
||||||
|
if fail:
|
||||||
|
raise exceptions.CantDeleteUser(self)
|
||||||
|
self.photodb.sql_delete(table='users', pairs={'id': self.id})
|
||||||
|
self._uncache()
|
||||||
|
self.deleted = True
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def display_name(self):
|
def display_name(self):
|
||||||
if self._display_name is None:
|
if self._display_name is None:
|
||||||
|
@ -1736,6 +1772,26 @@ class User(ObjectBase):
|
||||||
[self.id]
|
[self.id]
|
||||||
)
|
)
|
||||||
|
|
||||||
|
def has_any_albums(self):
|
||||||
|
query = f'SELECT 1 FROM albums WHERE author_id == ? LIMIT 1'
|
||||||
|
row = self.photodb.sql_select_one(query, [self.id])
|
||||||
|
return row is not None
|
||||||
|
|
||||||
|
def has_any_bookmarks(self):
|
||||||
|
query = f'SELECT 1 FROM bookmarks WHERE author_id == ? LIMIT 1'
|
||||||
|
row = self.photodb.sql_select_one(query, [self.id])
|
||||||
|
return row is not None
|
||||||
|
|
||||||
|
def has_any_photos(self):
|
||||||
|
query = f'SELECT 1 FROM photos WHERE author_id == ? LIMIT 1'
|
||||||
|
row = self.photodb.sql_select_one(query, [self.id])
|
||||||
|
return row is not None
|
||||||
|
|
||||||
|
def has_any_tags(self):
|
||||||
|
query = f'SELECT 1 FROM tags WHERE author_id == ? LIMIT 1'
|
||||||
|
row = self.photodb.sql_select_one(query, [self.id])
|
||||||
|
return row is not None
|
||||||
|
|
||||||
def jsonify(self):
|
def jsonify(self):
|
||||||
j = {
|
j = {
|
||||||
'type': 'user',
|
'type': 'user',
|
||||||
|
|
Loading…
Reference in a new issue