Commit 52ba6c424d2137dc29436b45a0b5823e96a07e4a
1 parent
52f695e0
Exists in
master
and in
5 other branches
replicate couse #189
Showing
5 changed files
with
52 additions
and
5 deletions
Show diff stats
courses/models.py
@@ -65,9 +65,11 @@ class Course(models.Model): | @@ -65,9 +65,11 @@ class Course(models.Model): | ||
65 | 65 | ||
66 | def show_subscribe(self): | 66 | def show_subscribe(self): |
67 | today = datetime.date.today() | 67 | today = datetime.date.today() |
68 | - | ||
69 | return today >= self.init_register_date and today <= self.end_register_date | 68 | return today >= self.init_register_date and today <= self.end_register_date |
70 | 69 | ||
70 | + def duration(self): | ||
71 | + return self.end_date - self.init_date | ||
72 | + | ||
71 | class Subject(models.Model): | 73 | class Subject(models.Model): |
72 | 74 | ||
73 | name = models.CharField(_('Name'), max_length = 100) | 75 | name = models.CharField(_('Name'), max_length = 100) |
courses/static/js/course.js
@@ -63,4 +63,18 @@ function delete_course(url, course, message, return_url) { | @@ -63,4 +63,18 @@ function delete_course(url, course, message, return_url) { | ||
63 | } | 63 | } |
64 | }); | 64 | }); |
65 | }); | 65 | }); |
66 | +} | ||
67 | +/* | ||
68 | +* | ||
69 | +* Function to load create course's form | ||
70 | +* | ||
71 | +*/ | ||
72 | +function replicate_course(url, course) { | ||
73 | + $.ajax({ | ||
74 | + url: url, | ||
75 | + data: {'form': course}, | ||
76 | + success: function(data) { | ||
77 | + $(".course_replicate_form").html(data); | ||
78 | + } | ||
79 | + }); | ||
66 | } | 80 | } |
67 | \ No newline at end of file | 81 | \ No newline at end of file |
courses/templates/course/course_card.html
@@ -18,7 +18,7 @@ | @@ -18,7 +18,7 @@ | ||
18 | <i class="fa fa-ellipsis-v fa-2x" aria-hidden="true"></i> | 18 | <i class="fa fa-ellipsis-v fa-2x" aria-hidden="true"></i> |
19 | </button> | 19 | </button> |
20 | <ul class="dropdown-menu" aria-labelledby="moreActions"> | 20 | <ul class="dropdown-menu" aria-labelledby="moreActions"> |
21 | - <li><a href="javascript:replicate_course('{% url 'course:create'%}','{{course.slug}}')"><i class="fa fa-files-o fa-fw" aria-hidden="true"></i>{% trans 'Replicate' %}</a></li> | 21 | + <li><a href="{% url 'course:replicate_course' course.slug %}"><i class="fa fa-files-o fa-fw" aria-hidden="true"></i>{% trans 'Replicate' %}</a></li> |
22 | <li><a href="javascript:delete_course('{% url 'course:delete' course.slug %}', '{{ course.slug }}', '{% trans "Are you sure you want to delete this course?" %}', '{% url 'course:manage' %}')"><i class="fa fa-trash fa-fw" aria-hidden="true"></i>{% trans 'Remove' %}</a></li> | 22 | <li><a href="javascript:delete_course('{% url 'course:delete' course.slug %}', '{{ course.slug }}', '{% trans "Are you sure you want to delete this course?" %}', '{% url 'course:manage' %}')"><i class="fa fa-trash fa-fw" aria-hidden="true"></i>{% trans 'Remove' %}</a></li> |
23 | </ul> | 23 | </ul> |
24 | </div> | 24 | </div> |
@@ -47,7 +47,7 @@ | @@ -47,7 +47,7 @@ | ||
47 | <div class="modal-dialog" role="document"> | 47 | <div class="modal-dialog" role="document"> |
48 | <div class="modal-content"> | 48 | <div class="modal-content"> |
49 | <div class="modal-header"> | 49 | <div class="modal-header"> |
50 | - <h4 class="modal-title" id="myModalLabel">{% trans 'Forum' %}</h4> | 50 | + <h4 class="modal-title" id="myModalLabel">{% trans 'Repicate Course' %}</h4> |
51 | </div> | 51 | </div> |
52 | <div class="modal-body"> | 52 | <div class="modal-body"> |
53 | <section> | 53 | <section> |
courses/urls.py
@@ -4,6 +4,7 @@ from . import views | @@ -4,6 +4,7 @@ from . import views | ||
4 | urlpatterns = [ | 4 | urlpatterns = [ |
5 | url(r'^$', views.IndexView.as_view(), name='manage'), | 5 | url(r'^$', views.IndexView.as_view(), name='manage'), |
6 | url(r'^create/$', views.CreateCourseView.as_view(), name='create'), | 6 | url(r'^create/$', views.CreateCourseView.as_view(), name='create'), |
7 | + url(r'^replicate_course/(?P<slug>[\w_-]+)/$', views.ReplicateCourseView.as_view(), name='replicate_course'), | ||
7 | url(r'^edit/(?P<slug>[\w_-]+)/$', views.UpdateCourseView.as_view(), name='update'), | 8 | url(r'^edit/(?P<slug>[\w_-]+)/$', views.UpdateCourseView.as_view(), name='update'), |
8 | url(r'^(?P<slug>[\w_-]+)/$', views.CourseView.as_view(), name='view'), | 9 | url(r'^(?P<slug>[\w_-]+)/$', views.CourseView.as_view(), name='view'), |
9 | 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'), |
courses/views.py
@@ -105,6 +105,38 @@ class CreateCourseView(LoginRequiredMixin, HasRoleMixin, NotificationMixin,gener | @@ -105,6 +105,38 @@ class CreateCourseView(LoginRequiredMixin, HasRoleMixin, NotificationMixin,gener | ||
105 | context['now'] = date.today() | 105 | context['now'] = date.today() |
106 | return context | 106 | return context |
107 | 107 | ||
108 | +class ReplicateCourseView(LoginRequiredMixin, HasRoleMixin, NotificationMixin,generic.edit.CreateView): | ||
109 | + | ||
110 | + allowed_roles = ['professor', 'system_admin'] | ||
111 | + login_url = reverse_lazy("core:home") | ||
112 | + redirect_field_name = 'next' | ||
113 | + template_name = 'course/replicate.html' | ||
114 | + form_class = CourseForm | ||
115 | + success_url = reverse_lazy('course:manage') | ||
116 | + | ||
117 | + def form_valid(self, form): | ||
118 | + self.object = form.save() | ||
119 | + self.object.professors.add(self.request.user) | ||
120 | + return super(ReplicateCourseView, self).form_valid(form) | ||
121 | + | ||
122 | + def get_context_data(self, **kwargs): | ||
123 | + context = super(ReplicateCourseView, self).get_context_data(**kwargs) | ||
124 | + course = get_object_or_404(Course, slug = self.kwargs.get('slug')) | ||
125 | + if has_role(self.request.user,'system_admin'): | ||
126 | + courses = Course.objects.all() | ||
127 | + elif has_role(self.request.user,'professor'): | ||
128 | + courses = self.request.user.courses.all() | ||
129 | + categorys_courses = CourseCategory.objects.all() | ||
130 | + context['courses'] = courses | ||
131 | + context['course'] = course | ||
132 | + context['categorys_courses'] = categorys_courses | ||
133 | + context['title'] = _("Replicate Course") | ||
134 | + context['now'] = date.today() | ||
135 | + return context | ||
136 | + | ||
137 | + def get_success_url(self): | ||
138 | + return reverse_lazy('course:view', kwargs={'slug' : self.object.slug}) | ||
139 | + | ||
108 | class UpdateCourseView(LoginRequiredMixin, HasRoleMixin, generic.UpdateView): | 140 | class UpdateCourseView(LoginRequiredMixin, HasRoleMixin, generic.UpdateView): |
109 | 141 | ||
110 | allowed_roles = ['professor', 'system_admin'] | 142 | allowed_roles = ['professor', 'system_admin'] |
@@ -136,8 +168,6 @@ class UpdateCourseView(LoginRequiredMixin, HasRoleMixin, generic.UpdateView): | @@ -136,8 +168,6 @@ class UpdateCourseView(LoginRequiredMixin, HasRoleMixin, generic.UpdateView): | ||
136 | def get_success_url(self): | 168 | def get_success_url(self): |
137 | return reverse_lazy('course:view', kwargs={'slug' : self.object.slug}) | 169 | return reverse_lazy('course:view', kwargs={'slug' : self.object.slug}) |
138 | 170 | ||
139 | - | ||
140 | - | ||
141 | class DeleteCourseView(LoginRequiredMixin, HasRoleMixin, generic.DeleteView): | 171 | class DeleteCourseView(LoginRequiredMixin, HasRoleMixin, generic.DeleteView): |
142 | 172 | ||
143 | allowed_roles = ['professor', 'system_admin'] | 173 | allowed_roles = ['professor', 'system_admin'] |