Commit c598560b63d25c05bb51b4116966871a59e5d26b

Authored by fbormann
2 parents 1641e766 85e51827

Merge branch 'refactoring' of https://github.com/amadeusproject/amadeuslms into refactoring

Showing 2 changed files with 42 additions and 38 deletions   Show diff stats
mural/views.py
... ... @@ -77,7 +77,7 @@ class GeneralIndex(LoginRequiredMixin, LogMixin, generic.ListView):
77 77 self.totals['general'] = general_visualizations.count()
78 78 self.totals['category'] = MuralVisualizations.objects.filter(Q(user = user) & Q(viewed = False) & ((Q(user__is_staff = True) & (Q(post__categorypost__isnull = False) | Q(comment__post__categorypost__isnull = False))) | Q(post__categorypost__space__coordinators = user) | Q(comment__post__categorypost__space__coordinators = user) | Q(post__categorypost__space__subject_category__students = user) | Q(comment__post__categorypost__space__subject_category__students = user) | Q(post__categorypost__space__subject_category__professor = user) | Q(comment__post__categorypost__space__subject_category__professor = user))).distinct().count()
79 79 self.totals['subject'] = MuralVisualizations.objects.filter(Q(user = user) & Q(viewed = False) & ((Q(user__is_staff = True) & (Q(post__subjectpost__isnull = False) | Q(comment__post__subjectpost__isnull = False))) | Q(post__subjectpost__space__professor = user) | Q(comment__post__subjectpost__space__professor = user) | Q(post__subjectpost__space__students = user) | Q(comment__post__subjectpost__space__students = user))).distinct().count()
80   -
  80 +
81 81 general_visualizations.update(viewed = True, date_viewed = datetime.now())
82 82  
83 83 MuralVisualizations.objects.filter(user = user, viewed = False, comment__post__generalpost__isnull = False).update(viewed = True, date_viewed = datetime.now())
... ... @@ -153,7 +153,7 @@ class GeneralCreate(LoginRequiredMixin, LogMixin, generic.edit.CreateView):
153 153 "user_icon": self.object.user.image_url,
154 154 "simple_notify": _("%s has made a post in General")%(str(self.object.user)),
155 155 "complete": render_to_string("mural/_view.html", {"post": self.object}, self.request),
156   - "container": ".post",
  156 + "container": ".post",
157 157 "accordion": False,
158 158 "post_type": "general"
159 159 }
... ... @@ -207,7 +207,7 @@ class GeneralUpdate(LoginRequiredMixin, LogMixin, generic.UpdateView):
207 207 self.object.save()
208 208  
209 209 users = User.objects.all().exclude(id = self.request.user.id)
210   -
  210 +
211 211 paths = [reverse("mural:manage_general")]
212 212  
213 213 notification = {
... ... @@ -226,7 +226,7 @@ class GeneralUpdate(LoginRequiredMixin, LogMixin, generic.UpdateView):
226 226 self.log_context['post_id'] = str(self.object.id)
227 227  
228 228 super(GeneralUpdate, self).createLog(self.request.user, self.log_component, self.log_action, self.log_resource, self.log_context)
229   -
  229 +
230 230 return super(GeneralUpdate, self).form_valid(form)
231 231  
232 232 def get_context_data(self, *args, **kwargs):
... ... @@ -261,7 +261,7 @@ class GeneralDelete(LoginRequiredMixin, LogMixin, generic.DeleteView):
261 261  
262 262 def get_success_url(self):
263 263 users = User.objects.all().exclude(id = self.request.user.id)
264   -
  264 +
265 265 paths = [reverse("mural:manage_general")]
266 266  
267 267 notification = {
... ... @@ -295,7 +295,7 @@ def load_category_posts(request, category):
295 295 mines = request.GET.get('mine', False)
296 296 showing = request.GET.get('showing', '')
297 297 n_views = 0
298   -
  298 +
299 299 if not favorites:
300 300 if mines:
301 301 posts = CategoryPost.objects.extra(select = {"most_recent": "greatest(last_update, (select max(mural_comment.last_update) from mural_comment where mural_comment.post_id = mural_categorypost.mural_ptr_id))"}).filter(space__id = category, mural_ptr__user = user)
... ... @@ -306,7 +306,7 @@ def load_category_posts(request, category):
306 306 posts = CategoryPost.objects.extra(select = {"most_recent": "greatest(last_update, (select max(mural_comment.last_update) from mural_comment where mural_comment.post_id = mural_categorypost.mural_ptr_id))"}).filter(space__id = category, favorites_post__isnull = False, favorites_post__user = user, mural_ptr__user = user)
307 307 else:
308 308 posts = CategoryPost.objects.extra(select = {"most_recent": "greatest(last_update, (select max(mural_comment.last_update) from mural_comment where mural_comment.post_id = mural_categorypost.mural_ptr_id))"}).filter(space__id = category, favorites_post__isnull = False, favorites_post__user = user)
309   -
  309 +
310 310 if showing: #Exclude ajax creation posts results
311 311 showing = showing.split(',')
312 312 posts = posts.exclude(id__in = showing)
... ... @@ -348,7 +348,7 @@ class CategoryIndex(LoginRequiredMixin, generic.ListView):
348 348  
349 349 def get_queryset(self):
350 350 user = self.request.user
351   -
  351 +
352 352 if user.is_staff:
353 353 categories = Category.objects.all()
354 354 else:
... ... @@ -366,7 +366,7 @@ class CategoryIndex(LoginRequiredMixin, generic.ListView):
366 366 context['title'] = _('Mural - Per Category')
367 367 context['totals'] = self.totals
368 368 context['mural_menu_active'] = 'subjects_menu_active'
369   -
  369 +
370 370 return context
371 371  
372 372 class CategoryCreate(LoginRequiredMixin, LogMixin, generic.edit.CreateView):
... ... @@ -400,7 +400,7 @@ class CategoryCreate(LoginRequiredMixin, LogMixin, generic.edit.CreateView):
400 400  
401 401 users = getSpaceUsers(self.request.user.id, self.object)
402 402 entries = []
403   -
  403 +
404 404 paths = [reverse("mural:manage_category")]
405 405  
406 406 notification = {
... ... @@ -410,7 +410,7 @@ class CategoryCreate(LoginRequiredMixin, LogMixin, generic.edit.CreateView):
410 410 "user_icon": self.object.user.image_url,
411 411 "simple_notify": _("%s has made a post in %s")%(str(self.object.user), str(self.object.space)),
412 412 "complete": render_to_string("mural/_view.html", {"post": self.object}, self.request),
413   - "container": "#" + slug,
  413 + "container": "#" + slug,
414 414 "accordion": True,
415 415 "post_type": "categories"
416 416 }
... ... @@ -468,7 +468,7 @@ class CategoryUpdate(LoginRequiredMixin, LogMixin, generic.UpdateView):
468 468 self.object.save()
469 469  
470 470 users = getSpaceUsers(self.request.user.id, self.object)
471   -
  471 +
472 472 paths = [reverse("mural:manage_category")]
473 473  
474 474 notification = {
... ... @@ -483,7 +483,7 @@ class CategoryUpdate(LoginRequiredMixin, LogMixin, generic.UpdateView):
483 483  
484 484 for user in users:
485 485 Group("user-%s" % user.id).send({'text': notification})
486   -
  486 +
487 487 self.log_context['post_id'] = self.object.id
488 488 self.log_context['category_id'] = self.object.space.id
489 489 self.log_context['category_name'] = self.object.space.name
... ... @@ -525,7 +525,7 @@ class CategoryDelete(LoginRequiredMixin, LogMixin, generic.DeleteView):
525 525  
526 526 def get_success_url(self):
527 527 users = getSpaceUsers(self.request.user.id, self.object)
528   -
  528 +
529 529 paths = [reverse("mural:manage_category")]
530 530  
531 531 notification = {
... ... @@ -584,7 +584,7 @@ def load_subject_posts(request, subject):
584 584 mines = request.GET.get('mine', False)
585 585 showing = request.GET.get('showing', '')
586 586 n_views = 0
587   -
  587 +
588 588 if not favorites:
589 589 if mines:
590 590 posts = SubjectPost.objects.extra(select = {"most_recent": "greatest(last_update, (select max(mural_comment.last_update) from mural_comment where mural_comment.post_id = mural_subjectpost.mural_ptr_id))"}).filter(space__id = subject, mural_ptr__user = user)
... ... @@ -595,7 +595,7 @@ def load_subject_posts(request, subject):
595 595 posts = SubjectPost.objects.extra(select = {"most_recent": "greatest(last_update, (select max(mural_comment.last_update) from mural_comment where mural_comment.post_id = mural_subjectpost.mural_ptr_id))"}).filter(space__id = subject, favorites_post__isnull = False, favorites_post__user = user, mural_ptr__user = user)
596 596 else:
597 597 posts = SubjectPost.objects.extra(select = {"most_recent": "greatest(last_update, (select max(mural_comment.last_update) from mural_comment where mural_comment.post_id = mural_subjectpost.mural_ptr_id))"}).filter(space__id = subject, favorites_post__isnull = False, favorites_post__user = user)
598   -
  598 +
599 599 if showing: #Exclude ajax creation posts results
600 600 showing = showing.split(',')
601 601 posts = posts.exclude(id__in = showing)
... ... @@ -637,7 +637,7 @@ class SubjectIndex(LoginRequiredMixin, generic.ListView):
637 637  
638 638 def get_queryset(self):
639 639 user = self.request.user
640   -
  640 +
641 641 if user.is_staff:
642 642 subjects = Subject.objects.all()
643 643 else:
... ... @@ -655,7 +655,7 @@ class SubjectIndex(LoginRequiredMixin, generic.ListView):
655 655 context['title'] = _('Mural - Per Subject')
656 656 context['totals'] = self.totals
657 657 context['mural_menu_active'] = 'subjects_menu_active'
658   -
  658 +
659 659 return context
660 660  
661 661 class SubjectCreate(LoginRequiredMixin, LogMixin, generic.edit.CreateView):
... ... @@ -716,7 +716,7 @@ class SubjectCreate(LoginRequiredMixin, LogMixin, generic.edit.CreateView):
716 716 "user_icon": self.object.user.image_url,
717 717 "simple_notify": _("%s has made a post in %s")%(str(self.object.user), str(self.object.space)),
718 718 "complete": render_to_string("mural/_view.html", {"post": self.object}, self.request),
719   - "container": "#" + slug,
  719 + "container": "#" + slug,
720 720 "accordion": True,
721 721 "post_type": "subjects"
722 722 }
... ... @@ -793,7 +793,7 @@ class SubjectUpdate(LoginRequiredMixin, LogMixin, generic.UpdateView):
793 793 self.object.save()
794 794  
795 795 users = getSpaceUsers(self.request.user.id, self.object)
796   -
  796 +
797 797 paths = [
798 798 reverse("mural:manage_subject"),
799 799 reverse("mural:subject_view", args = (), kwargs = {'slug': self.object.space.slug})
... ... @@ -826,7 +826,7 @@ class SubjectUpdate(LoginRequiredMixin, LogMixin, generic.UpdateView):
826 826 self.log_context['resource_slug'] = self.object.resource.slug
827 827  
828 828 super(SubjectUpdate, self).createLog(self.request.user, self.log_component, self.log_action, self.log_resource, self.log_context)
829   -
  829 +
830 830 return super(SubjectUpdate, self).form_valid(form)
831 831  
832 832 def get_context_data(self, *args, **kwargs):
... ... @@ -861,7 +861,7 @@ class SubjectDelete(LoginRequiredMixin, LogMixin, generic.DeleteView):
861 861  
862 862 def get_success_url(self):
863 863 users = getSpaceUsers(self.request.user.id, self.object)
864   -
  864 +
865 865 paths = [
866 866 reverse("mural:manage_subject"),
867 867 reverse("mural:subject_view", args = (), kwargs = {'slug': self.object.space.slug})
... ... @@ -1113,7 +1113,7 @@ class ResourceCreate(LoginRequiredMixin, LogMixin, generic.edit.CreateView):
1113 1113 form_class = ResourcePostForm
1114 1114  
1115 1115 def form_invalid(self, form):
1116   - context = super(SubjectCreate, self).form_invalid(form)
  1116 + context = super(ResourceCreate, self).form_invalid(form)
1117 1117 context.status_code = 400
1118 1118  
1119 1119 return context
... ... @@ -1151,7 +1151,7 @@ class ResourceCreate(LoginRequiredMixin, LogMixin, generic.edit.CreateView):
1151 1151 "user_icon": self.object.user.image_url,
1152 1152 "simple_notify": _("%s has made a post in %s")%(str(self.object.user), str(self.object.space)),
1153 1153 "complete": render_to_string("mural/_view.html", {"post": self.object}, self.request),
1154   - "container": "#" + slug,
  1154 + "container": "#" + slug,
1155 1155 "accordion": True,
1156 1156 "post_type": "subjects"
1157 1157 }
... ... @@ -1263,7 +1263,7 @@ class CommentCreate(LoginRequiredMixin, LogMixin, generic.edit.CreateView):
1263 1263  
1264 1264 users = getSpaceUsers(self.request.user.id, post)
1265 1265 entries = []
1266   -
  1266 +
1267 1267 paths = [
1268 1268 reverse("mural:manage_general"),
1269 1269 reverse("mural:manage_category"),
... ... @@ -1361,7 +1361,7 @@ class CommentUpdate(LoginRequiredMixin, LogMixin, generic.UpdateView):
1361 1361 self.object.save()
1362 1362  
1363 1363 users = getSpaceUsers(self.request.user.id, self.object.post)
1364   -
  1364 +
1365 1365 paths = [
1366 1366 reverse("mural:manage_general"),
1367 1367 reverse("mural:manage_category"),
... ... @@ -1411,7 +1411,7 @@ class CommentUpdate(LoginRequiredMixin, LogMixin, generic.UpdateView):
1411 1411 self.log_context['resource_slug'] = self.object.post.subjectpost.resource.slug
1412 1412  
1413 1413 super(CommentUpdate, self).createLog(self.request.user, self.log_component, self.log_action, self.log_resource, self.log_context)
1414   -
  1414 +
1415 1415 return super(CommentUpdate, self).form_valid(form)
1416 1416  
1417 1417 def get_context_data(self, *args, **kwargs):
... ... @@ -1541,7 +1541,7 @@ def load_comments(request, post, child_id):
1541 1541 comments = Comment.objects.filter(post__id = post).order_by('-last_update')
1542 1542 else:
1543 1543 showing = showing.split(',')
1544   - comments = Comment.objects.filter(post__id = post).exclude(id__in = showing).order_by('-last_update')
  1544 + comments = Comment.objects.filter(post__id = post).exclude(id__in = showing).order_by('-last_update')
1545 1545  
1546 1546 paginator = Paginator(comments, 5)
1547 1547  
... ... @@ -1563,4 +1563,4 @@ def load_comments(request, post, child_id):
1563 1563  
1564 1564 response = render_to_string("mural/_list_view_comment.html", context, request)
1565 1565  
1566   - return JsonResponse({"loaded": response})
1567 1566 \ No newline at end of file
  1567 + return JsonResponse({"loaded": response})
... ...
youtube_video/forms.py
... ... @@ -3,6 +3,10 @@ from django import forms
3 3 from django.utils.translation import ugettext_lazy as _
4 4 from django.forms.models import inlineformset_factory
5 5  
  6 +
  7 +import requests
  8 +import re
  9 +
6 10 from subjects.models import Tag
7 11  
8 12 from pendencies.forms import PendenciesForm
... ... @@ -10,19 +14,20 @@ from pendencies.models import Pendencies
10 14  
11 15 from .models import YTVideo
12 16  
  17 +
13 18 class YTVideoForm(forms.ModelForm):
14 19 subject = None
15 20 control_subject = forms.CharField(widget = forms.HiddenInput())
16   -
  21 +
17 22 def __init__(self, *args, **kwargs):
18 23 super(YTVideoForm, self).__init__(*args, **kwargs)
19 24  
20 25 self.subject = kwargs['initial'].get('subject', None)
21   -
  26 +
22 27 if self.instance.id:
23 28 self.subject = self.instance.topic.subject
24 29 self.initial['tags'] = ", ".join(self.instance.tags.all().values_list("name", flat = True))
25   -
  30 +
26 31 self.initial['control_subject'] = self.subject.id
27 32  
28 33 self.fields['students'].queryset = self.subject.students.all()
... ... @@ -44,7 +49,7 @@ class YTVideoForm(forms.ModelForm):
44 49  
45 50 def clean_name(self):
46 51 name = self.cleaned_data.get('name', '')
47   -
  52 +
48 53 topics = self.subject.topic_subject.all()
49 54  
50 55 for topic in topics:
... ... @@ -52,7 +57,7 @@ class YTVideoForm(forms.ModelForm):
52 57 same_name = topic.resource_topic.filter(name__unaccent__iexact = name).exclude(id = self.instance.id).count()
53 58 else:
54 59 same_name = topic.resource_topic.filter(name__unaccent__iexact = name).count()
55   -
  60 +
56 61 if same_name > 0:
57 62 self._errors['name'] = [_('This subject already has a youtube video with this name')]
58 63  
... ... @@ -62,8 +67,7 @@ class YTVideoForm(forms.ModelForm):
62 67  
63 68 def clean_url(self):
64 69 url = self.cleaned_data.get('url', '')
65   -
66   - if not 'youtube' in url:
  70 + if not 'youtube' in url or re.compile('[htps:/]*w*\.youtube\.com/?').fullmatch(url) or requests.get(url).status_code == 404:
67 71 self._errors['url'] = [_('Invalid URL. It should be an YouTube link.')]
68 72  
69 73 return ValueError
... ... @@ -83,7 +87,7 @@ class YTVideoForm(forms.ModelForm):
83 87 for prev in previous_tags:
84 88 if not prev.name in tags:
85 89 self.instance.tags.remove(prev)
86   -
  90 +
87 91 for tag in tags:
88 92 tag = tag.strip()
89 93  
... ... @@ -99,4 +103,4 @@ class YTVideoForm(forms.ModelForm):
99 103  
100 104 return self.instance
101 105  
102   -InlinePendenciesFormset = inlineformset_factory(YTVideo, Pendencies, form = PendenciesForm, extra = 1, max_num = 3, validate_max = True, can_delete = True)
103 106 \ No newline at end of file
  107 +InlinePendenciesFormset = inlineformset_factory(YTVideo, Pendencies, form = PendenciesForm, extra = 1, max_num = 3, validate_max = True, can_delete = True)
... ...