Commit 9b2182dd88febc3ba7be8e014eb99c64995f0c23
1 parent
8a1d0aaa
Exists in
master
and in
3 other branches
there is still a query to fix but I fixed most speed problems
Showing
2 changed files
with
28 additions
and
11 deletions
Show diff stats
subjects/utils.py
1 | + | |
1 | 2 | # File used to store useful subject functions # |
3 | +from categories.models import Category | |
4 | +from .models import Subject | |
5 | +from django.db.models import Q | |
2 | 6 | |
3 | 7 | def has_student_profile(user, category): |
4 | 8 | for subject in category.subject_category.all(): |
... | ... | @@ -14,15 +18,20 @@ def has_professor_profile(user, category): |
14 | 18 | |
15 | 19 | return False |
16 | 20 | |
17 | -def count_subjects(categories, user, all_subs = True): | |
21 | +def count_subjects( user, all_subs = True): | |
18 | 22 | total = 0 |
23 | + pk = user.pk | |
19 | 24 | |
20 | - for category in categories: | |
25 | + """for category in categories: | |
21 | 26 | if not all_subs: |
22 | 27 | for subject in category.subject_category.all(): |
23 | 28 | if user in subject.students.all() or user in subject.professor.all() or user in subject.category.coordinators.all(): |
24 | 29 | total += 1 |
25 | 30 | else: |
26 | - total += category.subject_category.count() | |
27 | - | |
31 | + total += category.subject_category.count()""" | |
32 | + if all_subs: | |
33 | + total += Category.objects.filter(Q(coordinators__pk = pk) | Q(visible=True) ).distinct().count() | |
34 | + else: | |
35 | + | |
36 | + total = Subject.objects.filter(Q(students__pk=pk) | Q(professor__pk=pk) | Q(category__coordinators__pk=pk)).distinct().count() | |
28 | 37 | return total |
29 | 38 | \ No newline at end of file | ... | ... |
subjects/views.py
... | ... | @@ -68,19 +68,27 @@ class IndexView(LoginRequiredMixin, ListView): |
68 | 68 | paginate_by = 10 |
69 | 69 | |
70 | 70 | def get_queryset(self): |
71 | - categories = Category.objects.all().order_by('name') | |
72 | - categories = [category for category in categories if self.request.user.is_staff or self.request.user in category.coordinators.all() or category.visible] | |
73 | - | |
74 | - self.totals['all_subjects'] = count_subjects(categories, self.request.user) | |
71 | + | |
72 | + if self.request.user.is_staff: | |
73 | + categories = Category.objects.all().order_by('name') | |
74 | + else: | |
75 | + pk = self.request.user.pk | |
76 | + | |
77 | + categories = Category.objects.filter(Q(coordinators__pk = pk) | Q(visible=True) ).order_by('name') | |
78 | + | |
79 | + self.totals['all_subjects'] = count_subjects(self.request.user) | |
80 | + | |
75 | 81 | self.totals['my_subjects'] = self.totals['all_subjects'] |
76 | 82 | |
77 | 83 | if not self.request.user.is_staff: |
84 | + | |
85 | + #my_categories = Category.objects.filter(Q(coordinators__pk=pk) | Q(subject_professor__pk=pk) | Q()) | |
78 | 86 | my_categories = [category for category in categories if self.request.user in category.coordinators.all() \ |
79 | 87 | or has_professor_profile(self.request.user, category) or has_student_profile(self.request.user, category)] |
80 | 88 | #So I remove all categories that doesn't have the possibility for the user to be on |
81 | - | |
82 | - self.totals['my_subjects'] = count_subjects(my_categories, self.request.user, False) | |
83 | - | |
89 | + | |
90 | + self.totals['my_subjects'] = count_subjects(self.request.user, False) | |
91 | + | |
84 | 92 | if not self.kwargs.get('option'): |
85 | 93 | categories = my_categories |
86 | 94 | ... | ... |