diff --git a/app/interface/models.py b/app/interface/models.py index 9b30396..eba220e 100644 --- a/app/interface/models.py +++ b/app/interface/models.py @@ -84,6 +84,23 @@ class Ensemble(models.Model): def __str__(self): return self.name +class ProjectQuerySet(models.QuerySet): + def current(self): + return self.filter(models.Q(event_date__gte=(timezone.now()-timezone.timedelta(7))) | models.Q(event_date=None)) + + def active(self): + return self.filter(active=True) + + def for_user(self, user, project_keys=[], ensemble_keys=[]): + if user.is_superuser: + return self + + f = models.Q(pk__in=project_keys) | models.Q(ensemble__slug__in=ensemble_keys) + + if user.is_authenticated: + f |= models.Q(ensemble__admins=user.pk) + + return self.filter(f) class Project(models.Model): ''' A Project linked to an ensemble @@ -98,6 +115,8 @@ class Project(models.Model): nonce = models.SmallIntegerField(default=1, help_text="Increment this to reset the authentication links") + objects = ProjectQuerySet.as_manager() + class Meta: ordering = ['active', 'event_date'] @@ -134,19 +153,6 @@ class Project(models.Model): def auth(self): return sign_data(f'{self.pk}-{self.nonce}', 12) - @classmethod - def for_user(cls, user, project_keys=[], ensemble_keys=[]): - projects = cls.objects.select_related('ensemble') - if user.is_superuser: - return projects - - f = models.Q(pk__in=project_keys) | models.Q(ensemble__slug__in=ensemble_keys) - - if user.is_authenticated: - f |= models.Q(ensemble__admins=user.pk) - - return projects.filter(f) - def __str__(self): return self.name diff --git a/app/interface/views.py b/app/interface/views.py index 9ff16c2..af94149 100644 --- a/app/interface/views.py +++ b/app/interface/views.py @@ -254,14 +254,12 @@ class ProjectListView(ProjectMixin, ListView): return True def get_project_queryset(self): - return models.Project.for_user(self.request.user, + return models.Project.objects.for_user(self.request.user, self.get_authorized_keys('project'), self.get_authorized_keys('ensemble')) def get_queryset(self): - qs = self.get_project_queryset() - f = Q(event_date__gte=(timezone.now()-timezone.timedelta(7))) | Q(event_date=None) - return qs.filter(f, active=True) + return self.get_project_queryset().current().active() class ProjectCreateView(EnsembleMixin, CreateView): admin_required = True diff --git a/app/library/views/__init__.py b/app/library/views/__init__.py index 43a1ec6..7271313 100644 --- a/app/library/views/__init__.py +++ b/app/library/views/__init__.py @@ -262,7 +262,7 @@ class WorkAddToProject(CollectionMixin, FormView): qs = f.fields['project'].queryset # Limit to projects for ensembles where we are an admin and they haven't occured yet - qs = qs.filter(ensemble__admins=self.request.user, event_date__gt=now()) + qs = qs.for_user(self.request.user).current() # dont show projects already added to work = self.get_object()