Commit 54c3e1be7a6039e9092b23825209815468719910
1 parent
e71c793f
Exists in
master
and in
5 other branches
[Issue #361]
Showing
3 changed files
with
79 additions
and
70 deletions
Show diff stats
courses/templates/subject/replicate.html
@@ -2,61 +2,51 @@ | @@ -2,61 +2,51 @@ | ||
2 | 2 | ||
3 | {% load static i18n permission_tags widget_tweaks %} | 3 | {% load static i18n permission_tags widget_tweaks %} |
4 | 4 | ||
5 | -{% block breadcrumbs %} | ||
6 | - <ol class="breadcrumb"> | ||
7 | - <li><a href="{% url 'app:index' %}">{% trans 'Home' %}</a></li> | ||
8 | - <li class="active">{% trans 'Replicate Subject' %}</li> | ||
9 | - </ol> | ||
10 | -{% endblock %} | ||
11 | - | ||
12 | {% block content %} | 5 | {% block content %} |
13 | -<div class="panel panel-default"> | 6 | + |
7 | + <div class="panel panel-default"> | ||
14 | <div class="panel-body"> | 8 | <div class="panel-body"> |
15 | <form class="form-group " method="post" action=""> | 9 | <form class="form-group " method="post" action=""> |
16 | {% csrf_token %} | 10 | {% csrf_token %} |
17 | 11 | ||
18 | <div class="form-group {% if subject.name.errors %} has-error{% endif %}"> | 12 | <div class="form-group {% if subject.name.errors %} has-error{% endif %}"> |
19 | - <label for="{{ id_name }}" class="control-label label-static"> {% trans 'Name' %}</label> | ||
20 | - <input class="form-control" id="id_name" maxlength="100" name="name" type="text" required="True" value="{{subject.name}}"> | ||
21 | - <span class="help-block">{% trans 'Subject name' %}</span> | 13 | + <label for="id_name" class="control-label label-static"> {% trans 'Name'%}</label> |
14 | + <textarea class="form-control" id="id_name" maxlength="100" rows="1" name="name" placeholder="Name" type="text" required >{{subject.name}}</textarea> | ||
22 | 15 | ||
16 | + <span class="help-block">{% trans 'Subject name'%}</span> | ||
23 | </div> | 17 | </div> |
24 | 18 | ||
25 | - <div class="form-group {% if subject.name.errors %} has-error{% endif %}"> | ||
26 | - <label for="{{ id_description }}" class="control-label label-static"> {% trans 'Description' %} </label> | ||
27 | - <textarea class="form-control" id="id_description" name="description" type="text" required="">{{subject.description}}</textarea> | ||
28 | - <span class="help-block">{% trans 'Subject Description' %}</span> | 19 | + <div class="form-group"> |
20 | + <label for="id_description" class="control-label label-static"> {% trans 'Description'%}</label> | ||
21 | + <textarea class="form-control" id="id_description" name="description" placeholder="Description" type="text" >{{subject.description}}</textarea> | ||
29 | 22 | ||
23 | + <span class="help-block">{% trans 'Subject description'%}</span> | ||
30 | </div> | 24 | </div> |
31 | 25 | ||
32 | - <div class="form-group {% if subject.name.errors %} has-error{% endif %}"> | ||
33 | - <label for="{{ id_init_date }}" class="control-label label-static"> {% trans 'Init date' %}</label> | ||
34 | - <input type="text" class="form-control date-picker" name="{{field.name}}" value="{{field.value|date:'SHORT_DA E_FORMAT'}}" min="{{now|date:'SHORT_DATE_FORMAT'}}"> | ||
35 | - <span class="help-block">{% trans 'Subject init date' %}</span> | 26 | + <div class="form-group"> |
27 | + <label for="id_init_date" class="control-label label-static"> {% trans 'Init date'%}</label> | ||
28 | + <input type="text" class="form-control date-picker" name="init_date" value="{{field.value|date:'SHORT_DATE_FORMAT'}}" min="{{now|date:'SHORT_DATE_FORMAT'}}"> | ||
36 | 29 | ||
30 | + <span class="help-block">{% trans 'Init date'%}</span> | ||
37 | </div> | 31 | </div> |
38 | 32 | ||
39 | - <div class="form-group {% if subject.name.errors %} has-error{% endif %}"> | ||
40 | - <label for="{{ id_end_date }}" class="control-label label-static"> {% trans 'End date' %}</label> | ||
41 | - <input type="text" class="form-control date-picker" name="{{field.name}}" value="{{field.value|date:'SHORT_DA E_FORMAT'}}" min="{{now|date:'SHORT_DATE_FORMAT'}}"> | ||
42 | - <span class="help-block">{% trans 'Subject end date' %}</span> | ||
43 | - | ||
44 | - </div> | ||
45 | - <div class="form-group {% if subject.name.errors %} has-error{% endif %}"> | ||
46 | - <label for="{{ id_visible }}" class="control-label label-static"> {% trans 'Visible?' %} </label> | ||
47 | - <input type="checkbox" class="form-control" id="id_visible" name="visible" required="true"/> | ||
48 | - <span class="help-block">{% trans 'Is it visible?' %}</span> | 33 | + <div class="form-group"> |
34 | + <label for="id_end_date" class="control-label label-static"> {% trans 'End date'%}</label> | ||
35 | + <input type="text" class="form-control date-picker" name="end_date" value="{{field.value|date:'SHORT_DATE_FORMAT'}}" min="{{now|date:'SHORT_DATE_FORMAT'}}"> | ||
49 | 36 | ||
37 | + <span class="help-block">{% trans 'End date'%}</span> | ||
50 | </div> | 38 | </div> |
51 | 39 | ||
40 | + <div class="form-group"> | ||
41 | + <label for="id_visible" class="control-label label-static"> {% trans 'Visible'%}</label> | ||
42 | + <input class="form-control" id="id_visible" name="visible" type="checkbox"/> | ||
52 | 43 | ||
44 | + <span class="help-block">{% trans 'Is it visible?'%}</span> | ||
53 | </div> | 45 | </div> |
54 | - | ||
55 | <div class="col-lg-offset-4 col-lg-4"> | 46 | <div class="col-lg-offset-4 col-lg-4"> |
56 | - <button type="submit" class="btn btn-raised btn-primary btn-lg btn-block">{% trans 'Replicate' %}</button> | 47 | + <button type="submite" class="btn btn-raised btn-primary btn-lg btn-block">{% trans 'Replicate' %}</button> |
57 | </div> | 48 | </div> |
58 | </form> | 49 | </form> |
59 | - | ||
60 | </div> | 50 | </div> |
61 | </div> | 51 | </div> |
62 | 52 | ||
@@ -70,4 +60,4 @@ | @@ -70,4 +60,4 @@ | ||
70 | $('#id_description').summernote({height: 300}); | 60 | $('#id_description').summernote({height: 300}); |
71 | }); | 61 | }); |
72 | </script> | 62 | </script> |
73 | -{% endblock %} | ||
74 | \ No newline at end of file | 63 | \ No newline at end of file |
64 | +{% endblock content %} |
courses/urls.py
@@ -6,7 +6,6 @@ urlpatterns = [ | @@ -6,7 +6,6 @@ urlpatterns = [ | ||
6 | url(r'^all-courses/$', views.AllCoursesView.as_view(), name='all_courses'), | 6 | url(r'^all-courses/$', views.AllCoursesView.as_view(), name='all_courses'), |
7 | url(r'^create/$', views.CreateCourseView.as_view(), name='create'), | 7 | url(r'^create/$', views.CreateCourseView.as_view(), name='create'), |
8 | url(r'^replicate_course/(?P<slug>[\w_-]+)/$', views.ReplicateCourseView.as_view(), name='replicate_course'), | 8 | url(r'^replicate_course/(?P<slug>[\w_-]+)/$', views.ReplicateCourseView.as_view(), name='replicate_course'), |
9 | - url(r'^replicate_subject/(?P<slug>[\w_-]+)/$', views.ReplicateSubjectView.as_view(), name='replicate_subject'), | ||
10 | url(r'^edit/(?P<slug>[\w_-]+)/$', views.UpdateCourseView.as_view(), name='update'), | 9 | url(r'^edit/(?P<slug>[\w_-]+)/$', views.UpdateCourseView.as_view(), name='update'), |
11 | url(r'^delete/(?P<slug>[\w_-]+)/$', views.DeleteCourseView.as_view(), name='delete'), | 10 | url(r'^delete/(?P<slug>[\w_-]+)/$', views.DeleteCourseView.as_view(), name='delete'), |
12 | url(r'^subscribe/(?P<slug>[\w_-]+)/$', views.subscribe_course, name='subscribe'), | 11 | url(r'^subscribe/(?P<slug>[\w_-]+)/$', views.subscribe_course, name='subscribe'), |
@@ -19,10 +18,11 @@ urlpatterns = [ | @@ -19,10 +18,11 @@ urlpatterns = [ | ||
19 | url(r'^subjects/create/(?P<slug>[\w_-]+)/$', views.CreateSubjectView.as_view(), name='create_subject'), | 18 | url(r'^subjects/create/(?P<slug>[\w_-]+)/$', views.CreateSubjectView.as_view(), name='create_subject'), |
20 | url(r'^subjects/update/(?P<slug>[\w_-]+)/$', views.UpdateSubjectView.as_view(), name='update_subject'), | 19 | url(r'^subjects/update/(?P<slug>[\w_-]+)/$', views.UpdateSubjectView.as_view(), name='update_subject'), |
21 | url(r'^subjects/delete/(?P<slug>[\w_-]+)/$', views.DeleteSubjectView.as_view(), name='delete_subject'), | 20 | url(r'^subjects/delete/(?P<slug>[\w_-]+)/$', views.DeleteSubjectView.as_view(), name='delete_subject'), |
21 | + url(r'^subjects/replicate/(?P<slug>[\w_-]+)/$', views.ReplicateSubjectView.as_view(), name='replicate_subject'), | ||
22 | url(r'^subjects/subscribe/(?P<slug>[\w_-]+)/$', views.subscribe_subject, name='subscribe_subject'), | 22 | url(r'^subjects/subscribe/(?P<slug>[\w_-]+)/$', views.subscribe_subject, name='subscribe_subject'), |
23 | url(r'^topics/create/(?P<slug>[\w_-]+)/$', views.CreateTopicView.as_view(), name='create_topic'), | 23 | url(r'^topics/create/(?P<slug>[\w_-]+)/$', views.CreateTopicView.as_view(), name='create_topic'), |
24 | url(r'^topics/update/(?P<slug>[\w_-]+)/$', views.UpdateTopicView.as_view(), name='update_topic'), | 24 | url(r'^topics/update/(?P<slug>[\w_-]+)/$', views.UpdateTopicView.as_view(), name='update_topic'), |
25 | - url(r'^topics/update/(?P<slug>[\w_-]+)/$', views.DeleteTopic.as_view(), name='delete_topic'), | 25 | + url(r'^topics/delete/(?P<slug>[\w_-]+)/$', views.DeleteTopic.as_view(), name='delete_topic'), |
26 | url(r'^topics/replicate/(?P<slug>[\w_-]+)/$', views.ReplicateTopicView.as_view(), name='replicate_topic'), | 26 | url(r'^topics/replicate/(?P<slug>[\w_-]+)/$', views.ReplicateTopicView.as_view(), name='replicate_topic'), |
27 | url(r'^topics/(?P<slug>[\w_-]+)/$', views.TopicsView.as_view(), name='view_topic'), | 27 | url(r'^topics/(?P<slug>[\w_-]+)/$', views.TopicsView.as_view(), name='view_topic'), |
28 | url(r'^subjects/categories$',views.IndexSubjectCategoryView.as_view(), name='subject_category_index'), | 28 | url(r'^subjects/categories$',views.IndexSubjectCategoryView.as_view(), name='subject_category_index'), |
courses/views.py
@@ -561,39 +561,6 @@ class SubjectsView(LoginRequiredMixin, LogMixin, generic.ListView): | @@ -561,39 +561,6 @@ class SubjectsView(LoginRequiredMixin, LogMixin, generic.ListView): | ||
561 | context['files'] = TopicFile.objects.filter(students__name = self.request.user.name) | 561 | context['files'] = TopicFile.objects.filter(students__name = self.request.user.name) |
562 | return context | 562 | return context |
563 | 563 | ||
564 | -class ReplicateSubjectView(LoginRequiredMixin, HasRoleMixin, LogMixin, NotificationMixin,generic.edit.CreateView): | ||
565 | - | ||
566 | - allowed_roles = ['professor', 'system_admin'] | ||
567 | - login_url = reverse_lazy("core:home") | ||
568 | - redirect_field_name = 'next' | ||
569 | - template_name = 'subject/replicate.html' | ||
570 | - form_class = SubjectForm | ||
571 | - success_url = reverse_lazy('course:view') | ||
572 | - | ||
573 | - def get_context_data(self, **kwargs): | ||
574 | - context = super(ReplicateSubjectView, self).get_context_data(**kwargs) | ||
575 | - subject = get_object_or_404(Subject, slug=self.kwargs.get('slug')) | ||
576 | - | ||
577 | - if has_role(self.request.user,'system_admin'): | ||
578 | - subjects = Subject.objects.all() | ||
579 | - context['subjects'] = subjects | ||
580 | - elif has_role(self.request.user,'professor'): | ||
581 | - subject = self.request.user.professors_subjects.all() | ||
582 | - categorys_subjects = CategorySubject.objects.all() | ||
583 | - | ||
584 | - context['subject'] = subject | ||
585 | - context['categorys_subjects'] = categorys_subjects | ||
586 | - context['title'] = _("Replicate Subject") | ||
587 | - context['now'] = date.today() | ||
588 | - return context | ||
589 | - | ||
590 | - def form_valid(self, form): | ||
591 | - self.object = form.save() | ||
592 | - | ||
593 | - return super(ReplicateSubjectView, self).form_valid(form) | ||
594 | - | ||
595 | - def get_success_url(self): | ||
596 | - return reverse_lazy('course:view', kwargs={'slug' : self.object.slug}) | ||
597 | 564 | ||
598 | class UploadMaterialView(LoginRequiredMixin, generic.edit.CreateView): | 565 | class UploadMaterialView(LoginRequiredMixin, generic.edit.CreateView): |
599 | login_url = reverse_lazy("core:home") | 566 | login_url = reverse_lazy("core:home") |
@@ -1017,7 +984,7 @@ class TopicViewSet(viewsets.ModelViewSet): | @@ -1017,7 +984,7 @@ class TopicViewSet(viewsets.ModelViewSet): | ||
1017 | class ReplicateTopicView (LoginRequiredMixin, HasRoleMixin, LogMixin, NotificationMixin,generic.edit.CreateView): | 984 | class ReplicateTopicView (LoginRequiredMixin, HasRoleMixin, LogMixin, NotificationMixin,generic.edit.CreateView): |
1018 | log_component = "course" | 985 | log_component = "course" |
1019 | log_resource = "topic" | 986 | log_resource = "topic" |
1020 | - log_action = "create" | 987 | + log_action = "replicate" |
1021 | log_context = {} | 988 | log_context = {} |
1022 | 989 | ||
1023 | allowed_roles = ['professor', 'system_admin'] | 990 | allowed_roles = ['professor', 'system_admin'] |
@@ -1067,4 +1034,56 @@ class ReplicateTopicView (LoginRequiredMixin, HasRoleMixin, LogMixin, Notificati | @@ -1067,4 +1034,56 @@ class ReplicateTopicView (LoginRequiredMixin, HasRoleMixin, LogMixin, Notificati | ||
1067 | 1034 | ||
1068 | super(ReplicateTopicView, self).createLog(self.request.user, self.log_component, self.log_action, self.log_resource, self.log_context) | 1035 | super(ReplicateTopicView, self).createLog(self.request.user, self.log_component, self.log_action, self.log_resource, self.log_context) |
1069 | 1036 | ||
1070 | - return super(ReplicateTopicView, self).form_valid(form) | ||
1071 | \ No newline at end of file | 1037 | \ No newline at end of file |
1038 | + return super(ReplicateTopicView, self).form_valid(form) | ||
1039 | + | ||
1040 | +class ReplicateSubjectView(LoginRequiredMixin, HasRoleMixin, LogMixin, NotificationMixin, generic.edit.CreateView): | ||
1041 | + log_component = "course" | ||
1042 | + log_resource = "subject" | ||
1043 | + log_action = "replicate" | ||
1044 | + log_context = {} | ||
1045 | + | ||
1046 | + allowed_roles = ['professor', 'system_admin'] | ||
1047 | + login_url = reverse_lazy("core:home") | ||
1048 | + redirect_field_name = 'next' | ||
1049 | + template_name = 'subject/replicate.html' | ||
1050 | + form_class = SubjectForm | ||
1051 | + | ||
1052 | + def get_success_url(self): | ||
1053 | + return reverse_lazy('course:view_subject', kwargs={'slug' : self.object.slug}) | ||
1054 | + | ||
1055 | + def get_context_data(self, **kwargs): | ||
1056 | + context = super(ReplicateSubjectView, self).get_context_data(**kwargs) | ||
1057 | + subject = get_object_or_404(Subject, slug = self.kwargs.get('slug')) | ||
1058 | + course = Course.objects.get(pk=subject.course_id) | ||
1059 | + context['course'] = course | ||
1060 | + context['subjects'] = course.subjects.filter(Q(visible=True) | Q(professors__in=[self.request.user])) | ||
1061 | + context['subject'] = subject | ||
1062 | + if (has_role(self.request.user,'system_admin')): | ||
1063 | + context['subjects'] = course.subjects.all() | ||
1064 | + return context | ||
1065 | + | ||
1066 | + def form_valid(self, form): | ||
1067 | + subject = get_object_or_404(Subject, slug = self.kwargs.get('slug')) | ||
1068 | + course = Course.objects.get(pk=subject.course_id) | ||
1069 | + | ||
1070 | + self.object = form.save(commit = False) | ||
1071 | + self.object.course = course | ||
1072 | + self.object.save() | ||
1073 | + self.object.professors.add(self.request.user) | ||
1074 | + if self.object.visible: | ||
1075 | + super(ReplicateSubjectView, self).createNotification( " created subject " + self.object.name, resource_name=self.object.name, | ||
1076 | + resource_slug = self.object.slug, actor=self.request.user, users= self.object.course.students.all(), | ||
1077 | + resource_link = reverse('course:view_subject', args=[self.object.slug])) | ||
1078 | + | ||
1079 | + self.log_context['subject_id'] = self.object.id | ||
1080 | + self.log_context['subject_name'] = self.object.name | ||
1081 | + self.log_context['subject_slug'] = self.object.slug | ||
1082 | + self.log_context['course_id'] = course.id | ||
1083 | + self.log_context['course_name'] = course.name | ||
1084 | + self.log_context['course_slug'] = course.slug | ||
1085 | + self.log_context['course_category_id'] = course.category.id | ||
1086 | + self.log_context['course_category_name'] = course.category.name | ||
1087 | + | ||
1088 | + super(ReplicateSubjectView, self).createLog(self.request.user, self.log_component, self.log_action, self.log_resource, self.log_context) | ||
1089 | + | ||
1090 | + return super(ReplicateSubjectView, self).form_valid(form) |