Commit f83e8bdfbe8af81bbf8a861f6d20aa9d51d88b10

Authored by fbormann
1 parent 29df64f6

actually built the topics index page, still has improvements to do so #50

core/migrations/0009_auto_20160916_0126.py 0 → 100644
... ... @@ -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 + ]
... ...
courses/migrations/0013_auto_20160916_0126.py 0 → 100644
... ... @@ -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 %}
... ...
courses/templates/topic/index.html 0 → 100644
... ... @@ -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 +
... ...