diff --git a/app/models.py b/app/models.py index 7dc6b0c3..870b7f71 100644 --- a/app/models.py +++ b/app/models.py @@ -37,6 +37,16 @@ class CorpusStatus(IntEnum): RUNNING_ANALYSIS_SESSION = 8 CANCELING_ANALYSIS_SESSION = 9 + @staticmethod + def get(corpus_status: Union['CorpusStatus', int, str]) -> 'CorpusStatus': + if isinstance(corpus_status, CorpusStatus): + return corpus_status + if isinstance(corpus_status, int): + return CorpusStatus(corpus_status) + if isinstance(corpus_status, str): + return CorpusStatus[corpus_status] + raise TypeError('corpus_status must be CorpusStatus, int, or str') + class JobStatus(IntEnum): INITIALIZING = 1 @@ -48,6 +58,16 @@ class JobStatus(IntEnum): COMPLETED = 7 FAILED = 8 + @staticmethod + def get(job_status: Union['JobStatus', int, str]) -> 'JobStatus': + if isinstance(job_status, JobStatus): + return job_status + if isinstance(job_status, int): + return JobStatus(job_status) + if isinstance(job_status, str): + return JobStatus[job_status] + raise TypeError('job_status must be JobStatus, int, or str') + class Permission(IntEnum): ''' @@ -68,6 +88,7 @@ class Permission(IntEnum): return Permission[permission] raise TypeError('permission must be Permission, int, or str') + class UserSettingJobStatusMailNotificationLevel(IntEnum): NONE = 1 END = 2 @@ -90,14 +111,14 @@ class CorpusFollowerPermission(IntEnum): UPDATE_FOLLOWER = 64 @staticmethod - def get(permission: Union['CorpusFollowerPermission', int, str]) -> 'CorpusFollowerPermission': - if isinstance(permission, CorpusFollowerPermission): - return permission - if isinstance(permission, int): - return CorpusFollowerPermission(permission) - if isinstance(permission, str): - return CorpusFollowerPermission[permission] - raise TypeError('permission must be CorpusFollowerPermission, int, or str') + def get(corpus_follower_permission: Union['CorpusFollowerPermission', int, str]) -> 'CorpusFollowerPermission': + if isinstance(corpus_follower_permission, CorpusFollowerPermission): + return corpus_follower_permission + if isinstance(corpus_follower_permission, int): + return CorpusFollowerPermission(corpus_follower_permission) + if isinstance(corpus_follower_permission, str): + return CorpusFollowerPermission[corpus_follower_permission] + raise TypeError('corpus_follower_permission must be CorpusFollowerPermission, int, or str') # endregion enums @@ -357,8 +378,7 @@ class CorpusFollowerRole(HashidMixin, db.Model): # Relationships corpus_follower_associations = db.relationship( 'CorpusFollowerAssociation', - back_populates='role', - lazy='dynamic' + back_populates='role' ) def __repr__(self): @@ -460,11 +480,9 @@ class CorpusFollowerAssociation(HashidMixin, db.Model): def __init__(self, **kwargs): super().__init__(**kwargs) - if self.role is None: - self.role = CorpusFollowerRole.query.filter_by(default=True).first() def __repr__(self): - return f'' + return f'' def to_json_serializeable(self, backrefs=False, relationships=False): json_serializeable = { @@ -524,8 +542,7 @@ class User(HashidMixin, UserMixin, db.Model): ) followed_corpora = association_proxy( 'corpus_follower_associations', - 'corpus', - creator=lambda c: CorpusFollowerAssociation(corpus=c) + 'corpus' ) jobs = db.relationship( 'Job', @@ -555,7 +572,7 @@ class User(HashidMixin, UserMixin, db.Model): cascade='all, delete-orphan', lazy='dynamic' ) - + def __init__(self, **kwargs): super().__init__(**kwargs) if self.role is not None: @@ -757,9 +774,11 @@ class User(HashidMixin, UserMixin, db.Model): self.profile_privacy_settings = 0 #endregion Profile Privacy settings - def follow_corpus(self, corpus): - if not self.is_following_corpus(corpus): - self.followed_corpora.append(corpus) + def follow_corpus(self, corpus, role=None): + if role is None: + r = CorpusFollowerRole.query.filter_by(default=True).first() + cfa = CorpusFollowerAssociation(corpus=corpus, role=r, follower=self) + db.session.add(cfa) def unfollow_corpus(self, corpus): if self.is_following_corpus(corpus): @@ -1509,8 +1528,7 @@ class Corpus(HashidMixin, db.Model): ) followers = association_proxy( 'corpus_follower_associations', - 'follower', - creator=lambda u: CorpusFollowerAssociation(followers=u) + 'follower' ) user = db.relationship('User', back_populates='corpora') # "static" attributes diff --git a/app/static/js/ResourceLists/CorpusFollowerList.js b/app/static/js/ResourceLists/CorpusFollowerList.js index cc94c568..b0b621d2 100644 --- a/app/static/js/ResourceLists/CorpusFollowerList.js +++ b/app/static/js/ResourceLists/CorpusFollowerList.js @@ -41,9 +41,9 @@ class CorpusFollowerList extends ResourceList {
@@ -176,6 +176,7 @@ class CorpusFollowerList extends ResourceList { case 'replace': { let re = new RegExp(`^/users/${this.userId}/corpora/${this.corpusId}/corpus_follower_associations/([A-Za-z0-9]*)/role$`); if (re.test(operation.path)) { + console.log('role updated'); let [match, jobId, valueName] = operation.path.match(re); this.replace(jobId, valueName, operation.value); } diff --git a/app/static/js/Utils.js b/app/static/js/Utils.js index 354f0f63..f8dbf2d0 100644 --- a/app/static/js/Utils.js +++ b/app/static/js/Utils.js @@ -69,13 +69,13 @@ class Utils { return Utils.mergeObjectsDeep(mergedObject, ...objects.slice(2)); } - static addCorpusFollowerPermissionRequest(corpusId, followerId, permission) { + static updateCorpusFollowerRole(corpusId, followerId, roleName) { return new Promise((resolve, reject) => { - fetch(`/corpora/${corpusId}/followers/${followerId}/permissions/${permission}/add`, {method: 'POST', headers: {Accept: 'application/json'}}) + fetch(`/corpora/${corpusId}/followers/${followerId}/role`, {method: 'POST', headers: {Accept: 'application/json', 'Content-Type': 'application/json'}, body: JSON.stringify({role: roleName})}) .then( (response) => { if (response.ok) { - app.flash(`Permission added`, 'corpus'); + app.flash('Role updated', 'corpus'); resolve(response); return; } else { @@ -91,27 +91,6 @@ class Utils { }); } - static removeCorpusFollowerPermissionRequest(corpusId, followerId, permission) { - return new Promise((resolve, reject) => { - fetch(`/corpora/${corpusId}/followers/${followerId}/permissions/${permission}/remove`, {method: 'POST', headers: {Accept: 'application/json'}}) - .then( - (response) => { - if (response.ok) { - app.flash(`Permission removed`, 'corpus'); - resolve(response); - } else { - app.flash(`${response.statusText}`, 'error'); - reject(response); - } - }, - (response) => { - app.flash('Something went wrong', 'error'); - reject(response); - } - ); - }); - } - static enableCorpusIsPublicRequest(userId, corpusId) { return new Promise((resolve, reject) => { let corpus;