Moved project filtering to the right place - the queryset
This commit is contained in:
parent
dbbfa79f10
commit
d7892d355d
@ -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
|
||||
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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()
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user