Commit f83e8bdfbe8af81bbf8a861f6d20aa9d51d88b10
1 parent
29df64f6
Exists in
master
and in
5 other branches
actually built the topics index page, still has improvements to do so #50
Showing
8 changed files
with
213 additions
and
19 deletions
Show diff stats
... | ... | @@ -0,0 +1,20 @@ |
1 | +# -*- coding: utf-8 -*- | |
2 | +# Generated by Django 1.10 on 2016-09-16 04:26 | |
3 | +from __future__ import unicode_literals | |
4 | + | |
5 | +from django.db import migrations | |
6 | + | |
7 | + | |
8 | +class Migration(migrations.Migration): | |
9 | + | |
10 | + dependencies = [ | |
11 | + ('core', '0008_resource_link'), | |
12 | + ] | |
13 | + | |
14 | + operations = [ | |
15 | + migrations.RenameField( | |
16 | + model_name='resource', | |
17 | + old_name='link', | |
18 | + new_name='url', | |
19 | + ), | |
20 | + ] | ... | ... |
... | ... | @@ -0,0 +1,48 @@ |
1 | +# -*- coding: utf-8 -*- | |
2 | +# Generated by Django 1.10 on 2016-09-16 04:26 | |
3 | +from __future__ import unicode_literals | |
4 | + | |
5 | +from django.conf import settings | |
6 | +from django.db import migrations, models | |
7 | +import django.db.models.deletion | |
8 | + | |
9 | + | |
10 | +class Migration(migrations.Migration): | |
11 | + | |
12 | + dependencies = [ | |
13 | + migrations.swappable_dependency(settings.AUTH_USER_MODEL), | |
14 | + ('core', '0009_auto_20160916_0126'), | |
15 | + ('courses', '0012_course_students'), | |
16 | + ] | |
17 | + | |
18 | + operations = [ | |
19 | + migrations.CreateModel( | |
20 | + name='Activity', | |
21 | + fields=[ | |
22 | + ('resource_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='core.Resource')), | |
23 | + ('create_date', models.DateTimeField(auto_now_add=True, verbose_name='Creation Date')), | |
24 | + ('limit_date', models.DateTimeField(verbose_name='Deliver Date')), | |
25 | + ('grade', models.IntegerField(verbose_name='grade')), | |
26 | + ('student', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='student', to=settings.AUTH_USER_MODEL, verbose_name='student')), | |
27 | + ], | |
28 | + bases=('core.resource',), | |
29 | + ), | |
30 | + migrations.CreateModel( | |
31 | + name='Link', | |
32 | + fields=[ | |
33 | + ('resource_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='core.Resource')), | |
34 | + ('url_field', models.CharField(max_length=300, verbose_name='url')), | |
35 | + ], | |
36 | + bases=('core.resource',), | |
37 | + ), | |
38 | + migrations.AddField( | |
39 | + model_name='topic', | |
40 | + name='visible', | |
41 | + field=models.BooleanField(default=False, verbose_name='Visible'), | |
42 | + ), | |
43 | + migrations.AddField( | |
44 | + model_name='activity', | |
45 | + name='topic', | |
46 | + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='topic', to='courses.Topic', verbose_name='Topic'), | |
47 | + ), | |
48 | + ] | ... | ... |
courses/templates/course/index.html
... | ... | @@ -54,7 +54,9 @@ |
54 | 54 | {% for course in courses %} |
55 | 55 | <div class="row well well-inverse"> |
56 | 56 | <div class="col-md-2"> |
57 | - <img src="{{ course.image.url }}" class="img-responsive" /> | |
57 | + {% if course.image %} | |
58 | + <img src="{{ course.image.url }}" class="img-responsive" /> | |
59 | + {% endif %} | |
58 | 60 | </div> |
59 | 61 | <div class="col-md-10"> |
60 | 62 | <div class="row"> | ... | ... |
courses/templates/course/view.html
... | ... | @@ -64,22 +64,24 @@ |
64 | 64 | <div class="panel panel-info"> |
65 | 65 | <div class="panel-heading"> |
66 | 66 | <div class="row"> |
67 | -<div class="col-md-10"> | |
67 | + <a href="{% url 'course:view_subject' subject.slug %}"> | |
68 | + <div class="col-md-10"> | |
68 | 69 | |
69 | - <h3 class="panel-title"><a href="{% url 'course:view_subject' subject.slug %}"></a>{{subject}}</h3> | |
70 | + <h3 class="panel-title">{{subject}}</h3> | |
70 | 71 | |
71 | - </div> | |
72 | - <div class="col-md-2 text-right"> | |
73 | - {% if user|has_role:'professor, system_admin' %} | |
74 | - <a href="{% url 'course:update_subject' subject.slug %}" style="padding: 3px; margin: 3px;" class="btn btn-sm btn-default"> | |
75 | - <span class="glyphicon glyphicon-edit"></span> | |
76 | - </a> | |
77 | - <a href="{% url 'course:delete_subject' subject.slug %}" style="padding: 3px; margin: 3px;" class="btn btn-sm btn-danger"> | |
78 | - <span class="glyphicon glyphicon-trash"></span> | |
79 | - </a> | |
80 | - {% endif %} | |
81 | - </div> | |
82 | -</div> | |
72 | + </div> | |
73 | + </a> | |
74 | + <div class="col-md-2 text-right"> | |
75 | + {% if user|has_role:'professor, system_admin' %} | |
76 | + <a href="{% url 'course:update_subject' subject.slug %}" style="padding: 3px; margin: 3px;" class="btn btn-sm btn-default"> | |
77 | + <span class="glyphicon glyphicon-edit"></span> | |
78 | + </a> | |
79 | + <a href="{% url 'course:delete_subject' subject.slug %}" style="padding: 3px; margin: 3px;" class="btn btn-sm btn-danger"> | |
80 | + <span class="glyphicon glyphicon-trash"></span> | |
81 | + </a> | |
82 | + {% endif %} | |
83 | + </div> | |
84 | + </div> | |
83 | 85 | </div> |
84 | 86 | <div class="panel-body"> |
85 | 87 | <p><b>{% trans "Professor" %}: </b>{% for professor in subject.professors.all %}{% if not forloop.first %},{% endif %} | ... | ... |
courses/templates/subject/index.html
... | ... | @@ -7,7 +7,12 @@ |
7 | 7 | <ol class="breadcrumb"> |
8 | 8 | <li><a href="{% url 'app:index' %}">{% trans 'Home' %}</a></li> |
9 | 9 | <li><a href="{% url 'course:view' course.slug %}">{{ course }}</a></li> |
10 | - <li class="active">{% trans 'Manage Subjects' %}</li> | |
10 | + {% if user|has_role:'professor' or user|has_role:'system_admin' %} | |
11 | + <li class="active">{% trans 'Manage Subjects' %}</li> | |
12 | + {% else %} | |
13 | + <li class="active">{{ subject.name }}</li> | |
14 | + {% endif %} | |
15 | + | |
11 | 16 | </ol> |
12 | 17 | {% endblock %} |
13 | 18 | |
... | ... | @@ -67,8 +72,10 @@ |
67 | 72 | {% include "subject/form_view_student.html" %} |
68 | 73 | {% endif %} |
69 | 74 | {% endfor %} |
75 | + {% if user|has_role:'system_admin' or topic.owner == user%} | |
76 | + <a name="create_topic" class="btn btn-primary btn-md btn-block" href="{% url 'course:create_topic' subject.slug %}">{% trans "Create Topic" %}</a> | |
77 | + {% endif %} | |
70 | 78 | |
71 | - <a name="create_topic" class="btn btn-primary btn-md btn-block" href="{% url 'course:create_topic' subject.slug %}">{% trans "Create Topic" %}</a> | |
72 | 79 | {% endblock %} |
73 | 80 | |
74 | 81 | {% block rightbar %} | ... | ... |
... | ... | @@ -0,0 +1,89 @@ |
1 | +{% extends 'base.html' %} | |
2 | + | |
3 | +{% load static i18n permission_tags %} | |
4 | + | |
5 | +{% block breadcrumbs %} | |
6 | + | |
7 | + <ol class="breadcrumb"> | |
8 | + <li><a href="{% url 'app:index' %}">{% trans 'Home' %}</a></li> | |
9 | + <li><a href="{% url 'course:view_subject' subject.slug %}">{{ subject }}</a></li> | |
10 | + {% if user|has_role:'professor' or user|has_role:'system_admin' %} | |
11 | + <li class="active">{% trans 'Manage Topic' %}</li> | |
12 | + {% else %} | |
13 | + <li class="active">{{ topic.name }}</li> | |
14 | + {% endif %} | |
15 | + | |
16 | + </ol> | |
17 | +{% endblock %} | |
18 | + | |
19 | +{% block sidebar %} | |
20 | + | |
21 | + <div class="panel panel-primary"> | |
22 | + | |
23 | + <div class="panel-heading"> | |
24 | + <h3 class="panel-title">{{course}}</h3> | |
25 | + </div> | |
26 | + | |
27 | + <div class="panel-body"> | |
28 | + <!--{% for subject in subjects %} | |
29 | + <div class="row"> | |
30 | + <div class="col-md-12 col-sm-12"> | |
31 | + {{subject}} | |
32 | + </div> | |
33 | + </div> | |
34 | + {% endfor %}--> | |
35 | + </div> | |
36 | + </div> | |
37 | + | |
38 | + | |
39 | +{% endblock %} | |
40 | + | |
41 | +{% block content %} | |
42 | + <div class="panel panel-info"> | |
43 | + <div class="panel-heading"> | |
44 | + <div class="row"> | |
45 | + <div class="col-md-7 col-sm-7"> | |
46 | + <h3>{{subject}}</h3> | |
47 | + </div> | |
48 | + <div class="col-md-2 col-sm-2"> | |
49 | + {% if user|has_role:'system_admin' or user in subject.professors %} | |
50 | + <a href="{% url 'course:update_subject' subject.slug%}" class="btn">{% trans "edit" %}</a> | |
51 | + {% endif %} | |
52 | + </div> | |
53 | + <div class="col-md-3 col-sm-3"> | |
54 | + {% if user|has_role:'system_admin' or user in subject.professors %} | |
55 | + <a href="{% url 'course:delete_subject' subject.slug%}" class="btn">{% trans "delete" %}</a> | |
56 | + {% endif %} | |
57 | + </div> | |
58 | + </div> | |
59 | + </div> | |
60 | + <div class="panel-body"> | |
61 | + <p> | |
62 | + {{subject.description|linebreaks}} | |
63 | + </p> | |
64 | + </div> | |
65 | + </div> | |
66 | +<!--{% for topic in topics %} | |
67 | + {% if user|has_role:'system_admin' or topic.owner == user%} | |
68 | + {% include "subject/form_view_teacher.html" %} | |
69 | + {% else %} | |
70 | + {% include "subject/form_view_student.html" %} | |
71 | + {% endif %} | |
72 | +{% endfor %} | |
73 | + {% if user|has_role:'system_admin' or topic.owner == user%} | |
74 | + <a name="create_topic" class="btn btn-primary btn-md btn-block" href="{% url 'course:create_topic' subject.slug %}">{% trans "Create Topic" %}</a> | |
75 | + {% endif %} | |
76 | + | |
77 | +{% endblock %}--> | |
78 | + | |
79 | +{% block rightbar %} | |
80 | + | |
81 | + <div class="panel panel-warning"> | |
82 | + <div class="panel-heading"> | |
83 | + <h3 class="panel-title">{% trans "Pending Stuffs" %}</h3> | |
84 | + </div> | |
85 | + <div class="panel-body"> | |
86 | + | |
87 | + </div> | |
88 | + </div> | |
89 | +{% endblock rightbar %} | ... | ... |
courses/urls.py
... | ... | @@ -15,9 +15,10 @@ urlpatterns = [ |
15 | 15 | url(r'^categories/(?P<slug>[\w_-]+)/$', views.ViewCat.as_view(), name='view_cat'), |
16 | 16 | url(r'^categories/delete/(?P<slug>[\w_-]+)/$', views.DeleteCatView.as_view(), name='delete_cat'), |
17 | 17 | url(r'^subjects/(?P<slug>[\w_-]+)/$', views.SubjectsView.as_view(), name='view_subject'), |
18 | - url(r'^topics/create/(?P<slug>[\w_-]+)/$', views.CreateTopicView.as_view(), name='create_topic'), | |
19 | - url(r'^topics/update/(?P<slug>[\w_-]+)/$', views.UpdateTopicView.as_view(), name='update_topic'), | |
20 | 18 | url(r'^subjects/create/(?P<slug>[\w_-]+)/$', views.CreateSubjectView.as_view(), name='create_subject'), |
21 | 19 | url(r'^subjects/update/(?P<slug>[\w_-]+)/$', views.UpdateSubjectView.as_view(), name='update_subject'), |
22 | 20 | url(r'^subjects/delete/(?P<slug>[\w_-]+)/$', views.DeleteSubjectView.as_view(), name='delete_subject'), |
21 | + url(r'^topics/create/(?P<slug>[\w_-]+)/$', views.CreateTopicView.as_view(), name='create_topic'), | |
22 | + url(r'^topics/update/(?P<slug>[\w_-]+)/$', views.UpdateTopicView.as_view(), name='update_topic'), | |
23 | + url(r'^topics/(?P<slug>[\w_-]+)/$', views.TopicsView.as_view(), name='view_topic') | |
23 | 24 | ] | ... | ... |
courses/views.py
... | ... | @@ -236,6 +236,29 @@ class SubjectsView(LoginRequiredMixin, generic.ListView): |
236 | 236 | context['topics'] = subject.topics.all() |
237 | 237 | return context |
238 | 238 | |
239 | +class TopicsView(LoginRequiredMixin, generic.ListView): | |
240 | + | |
241 | + login_url = reverse_lazy("core:home") | |
242 | + redirect_field_name = 'next' | |
243 | + template_name = 'topic/index.html' | |
244 | + context_object_name = 'topics' | |
245 | + model = Topic | |
246 | + | |
247 | + def get_queryset(self): | |
248 | + topic = get_object_or_404(Topic, slug = self.kwargs.get('slug')) | |
249 | + subject = topic.subject | |
250 | + context = subject.topics.filter(visible=True) | |
251 | + #if (self.request.user in subject.professors.all() or has_role(self.request.user,'system_admin')): | |
252 | + #context = subject.topics.all() <- Change it By Activities | |
253 | + return context | |
254 | + | |
255 | + def get_context_data(self, **kwargs): | |
256 | + topic = get_object_or_404(Topic, slug = self.kwargs.get('slug')) | |
257 | + context = super(TopicsView, self).get_context_data(**kwargs) | |
258 | + context['topic'] = topic | |
259 | + context['subject'] = topic.subject | |
260 | + return context | |
261 | + | |
239 | 262 | class CreateTopicView(LoginRequiredMixin, HasRoleMixin, NotificationMixin, generic.edit.CreateView): |
240 | 263 | |
241 | 264 | allowed_roles = ['professor', 'system_admin'] |
... | ... | @@ -384,3 +407,5 @@ class DeleteSubjectView(LoginRequiredMixin, HasRoleMixin, generic.DeleteView): |
384 | 407 | |
385 | 408 | def get_success_url(self): |
386 | 409 | return reverse_lazy('course:view_subject', kwargs={'slug' : self.object.course.subjects.all()[0].slug}) |
410 | + | |
411 | + | ... | ... |