Commit a68c0244965d503162e26c510d7b48cd8b5fa52a

Authored by Matheus Lins
2 parents 4f9d5620 82d4a01e

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

core/decorators.py
@@ -14,7 +14,25 @@ def log_decorator(log_action = '', log_resource = ''): @@ -14,7 +14,25 @@ def log_decorator(log_action = '', log_resource = ''):
14 action = Action.objects.filter(name = log_action) 14 action = Action.objects.filter(name = log_action)
15 resource = Resource.objects.filter(name = log_resource) 15 resource = Resource.objects.filter(name = log_resource)
16 16
17 - action_resource = Action_Resource.objects.filter(action = action, resource = resource)[0] 17 + if not action:
  18 + action = Action(name = log_action)
  19 + action.save()
  20 + else:
  21 + action = action[0]
  22 +
  23 + if not resource:
  24 + resource = Resource(name = log_resource)
  25 + resource.save()
  26 + else:
  27 + resource = resource[0]
  28 +
  29 + action_resource = Action_Resource.objects.filter(action = action, resource = resource)
  30 +
  31 + if not action_resource:
  32 + action_resource = Action_Resource(action = action, resource = resource)
  33 + action_resource.save()
  34 + else:
  35 + action_resource = action_resource[0]
18 36
19 log = Log() 37 log = Log()
20 log.user = request.user 38 log.user = request.user
@@ -26,4 +44,4 @@ def log_decorator(log_action = '', log_resource = ''): @@ -26,4 +44,4 @@ def log_decorator(log_action = '', log_resource = ''):
26 44
27 return wraps(view_function)(_decorator) 45 return wraps(view_function)(_decorator)
28 46
29 - return _log_decorator  
30 \ No newline at end of file 47 \ No newline at end of file
  48 + return _log_decorator
@@ -12,7 +12,7 @@ class RegisterUserForm(forms.ModelForm): @@ -12,7 +12,7 @@ class RegisterUserForm(forms.ModelForm):
12 def clean_email(self): 12 def clean_email(self):
13 email = self.cleaned_data['email'] 13 email = self.cleaned_data['email']
14 if User.objects.filter(email = email).exists(): 14 if User.objects.filter(email = email).exists():
15 - raise forms.ValidationError('Já existe um usuário cadastrado com este E-mail') 15 + raise forms.ValidationError('Ja existe um usuario cadastrado com este E-mail')
16 return email 16 return email
17 17
18 def clean_password(self): 18 def clean_password(self):
@@ -35,7 +35,7 @@ class RegisterUserForm(forms.ModelForm): @@ -35,7 +35,7 @@ class RegisterUserForm(forms.ModelForm):
35 password2 = self.cleaned_data.get("password2") 35 password2 = self.cleaned_data.get("password2")
36 36
37 if password and password2 and password != password2: 37 if password and password2 and password != password2:
38 - raise forms.ValidationError('A confirmacão da senha está incorreta') 38 + raise forms.ValidationError('A confirmacao da senha esta incorreta')
39 return password2 39 return password2
40 40
41 def save(self, commit=True): 41 def save(self, commit=True):
core/migrations/0003_auto_20160908_1108.py 0 → 100644
@@ -0,0 +1,28 @@ @@ -0,0 +1,28 @@
  1 +# -*- coding: utf-8 -*-
  2 +# Generated by Django 1.10 on 2016-09-08 14:08
  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', '0002_auto_20160907_0038'),
  15 + ]
  16 +
  17 + operations = [
  18 + migrations.AddField(
  19 + model_name='notification',
  20 + name='actor',
  21 + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='notification_Performer', to=settings.AUTH_USER_MODEL, verbose_name='Perfomer'),
  22 + ),
  23 + migrations.AlterField(
  24 + model_name='notification',
  25 + name='user',
  26 + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='notification_Actor', to=settings.AUTH_USER_MODEL, verbose_name='User'),
  27 + ),
  28 + ]
core/migrations/0004_auto_20160908_1151.py 0 → 100644
@@ -0,0 +1,20 @@ @@ -0,0 +1,20 @@
  1 +# -*- coding: utf-8 -*-
  2 +# Generated by Django 1.10 on 2016-09-08 14:51
  3 +from __future__ import unicode_literals
  4 +
  5 +from django.db import migrations, models
  6 +
  7 +
  8 +class Migration(migrations.Migration):
  9 +
  10 + dependencies = [
  11 + ('core', '0003_auto_20160908_1108'),
  12 + ]
  13 +
  14 + operations = [
  15 + migrations.AlterField(
  16 + model_name='resource',
  17 + name='name',
  18 + field=models.CharField(max_length=100, unique=True, verbose_name='Name'),
  19 + ),
  20 + ]
core/mixins.py
1 from django.conf import settings 1 from django.conf import settings
2 -from .models import Action, Resource, Action_Resource, Log 2 +from .models import Action, Resource, Action_Resource, Log, Notification
3 3
4 class LogMixin(object): 4 class LogMixin(object):
5 log_action = "" 5 log_action = ""
@@ -9,7 +9,25 @@ class LogMixin(object): @@ -9,7 +9,25 @@ class LogMixin(object):
9 action = Action.objects.filter(name = self.log_action) 9 action = Action.objects.filter(name = self.log_action)
10 resource = Resource.objects.filter(name = self.log_resource) 10 resource = Resource.objects.filter(name = self.log_resource)
11 11
12 - action_resource = Action_Resource.objects.filter(action = action, resource = resource)[0] 12 + if not action:
  13 + action = Action(name = self.log_action)
  14 + action.save()
  15 + else:
  16 + action = action[0]
  17 +
  18 + if not resource:
  19 + resource = Resource(name = self.log_resource)
  20 + resource.save()
  21 + else:
  22 + resource = resource[0]
  23 +
  24 + action_resource = Action_Resource.objects.filter(action = action, resource = resource)
  25 +
  26 + if not action_resource:
  27 + action_resource = Action_Resource(action = action, resource = resource)
  28 + action_resource.save()
  29 + else:
  30 + action_resource = action_resource[0]
13 31
14 log = Log() 32 log = Log()
15 log.user = request.user 33 log.user = request.user
@@ -17,4 +35,21 @@ class LogMixin(object): @@ -17,4 +35,21 @@ class LogMixin(object):
17 35
18 log.save() 36 log.save()
19 37
20 - return super(LogMixin, self).dispatch(request, *args, **kwargs)  
21 \ No newline at end of file 38 \ No newline at end of file
  39 + return super(LogMixin, self).dispatch(request, *args, **kwargs)
  40 +
  41 +class NotificationMixin(object):
  42 + message = ""
  43 + read = False
  44 +
  45 + def dispatch(self, request, *args, **kwargs):
  46 + action = Action.objects.filter(name = self.log_action)
  47 + resource = Resource.objects.filter(name = self.log_resource)
  48 +
  49 + action_resource = Action_Resource.objects.filter(action = action, resource = resource)[0]
  50 +
  51 + notification = Notification()
  52 + notification.action_resource = action_resource
  53 + notification.user = request.user #We still have to handle the notification to be sent to an amount of Users
  54 +
  55 + notification.read = read
  56 + notification.message = ""
core/models.py
@@ -24,9 +24,14 @@ class Resource(models.Model): @@ -24,9 +24,14 @@ class Resource(models.Model):
24 """ 24 """
25 It represents the resource where the action was applied on. 25 It represents the resource where the action was applied on.
26 Example: Pool was answered (Resource: Pool), PDF was visualized(Resource: PDF). 26 Example: Pool was answered (Resource: Pool), PDF was visualized(Resource: PDF).
  27 +
  28 + Attributes:
  29 + @name: name of the resource affected, it will be unique because a resource can be affecte
  30 + by a huge amount of actions
  31 + @created_date: The date the resource was created
27 """ 32 """
28 33
29 - name = models.CharField(_('Name'), max_length =100) 34 + name = models.CharField(_('Name'), max_length =100, unique=True)
30 created_date = models.DateField(_('Created Date'), auto_now_add=True) 35 created_date = models.DateField(_('Created Date'), auto_now_add=True)
31 36
32 class Meta: 37 class Meta:
@@ -51,12 +56,23 @@ class Action_Resource(models.Model): @@ -51,12 +56,23 @@ class Action_Resource(models.Model):
51 56
52 57
53 class Notification(models.Model): 58 class Notification(models.Model):
  59 + """
  60 + Attributes:
  61 + @message: The message that will be shown on the notification prompt
  62 + @user: The User that the notification will be sent to.
  63 + @read: Whether or not the user has read the notification.
  64 + @datetime: The time the notification was created
  65 + @action_resource: The Object that holds the information about which action was perfomed on the Resource
  66 + @actor: The user who applied the action
  67 + """
  68 +
54 message = models.TextField(_('Message')) 69 message = models.TextField(_('Message'))
55 - user = models.ForeignKey(User, verbose_name = _('Actor')) 70 + user = models.ForeignKey(User, related_name = _('%(class)s_Actor'), verbose_name= _('User'))
56 read = models.BooleanField(_('Read'), default = False) 71 read = models.BooleanField(_('Read'), default = False)
57 datetime = models.DateTimeField(_("Date and Time of action"), auto_now_add = True) 72 datetime = models.DateTimeField(_("Date and Time of action"), auto_now_add = True)
58 action_resource = models.ForeignKey(Action_Resource, verbose_name = _('Action_Resource')) 73 action_resource = models.ForeignKey(Action_Resource, verbose_name = _('Action_Resource'))
59 - 74 + actor = models.ForeignKey(User, related_name = _('%(class)s_Performer'), verbose_name= _('Perfomer'), null = True)
  75 +
60 class Meta: 76 class Meta:
61 verbose_name = _("Notification") 77 verbose_name = _("Notification")
62 verbose_name_plural = _("Notifications") 78 verbose_name_plural = _("Notifications")
core/templates/base.html
@@ -37,6 +37,7 @@ @@ -37,6 +37,7 @@
37 </head> 37 </head>
38 <body> 38 <body>
39 {% block nav %} 39 {% block nav %}
  40 + <div class="container-fluid">
40 <div class="row"> 41 <div class="row">
41 <div class="navbar navbar-default"> 42 <div class="navbar navbar-default">
42 <div class="container-fluid"> 43 <div class="container-fluid">
@@ -59,9 +60,10 @@ @@ -59,9 +60,10 @@
59 </div> 60 </div>
60 </div> 61 </div>
61 </div> 62 </div>
  63 + </div>
62 {% endblock %} 64 {% endblock %}
63 65
64 - <div class="container"> 66 + <div class="container-fluid">
65 {% block breadcrumbs %} 67 {% block breadcrumbs %}
66 68
67 {% endblock %} 69 {% endblock %}
core/templates/index.html
@@ -6,15 +6,18 @@ @@ -6,15 +6,18 @@
6 {% block nav %} 6 {% block nav %}
7 {% endblock %} 7 {% endblock %}
8 8
  9 +{% block sidebar %}
  10 + {% endblock sidebar %}
  11 +
9 {% block content %} 12 {% block content %}
10 <div class="row logo-row"> 13 <div class="row logo-row">
11 - <div class="col-lg-offset-2 col-lg-9">  
12 - <img src="..." class="img-responsive center-block " alt="logo amadeus"> 14 + <div class="col-md-offset-4 col-md-4 col-xs-4 col-xs-offset-4 logoLogin">
  15 + <img src="{% static 'img/amadeus.png' %}" class="img-responsive center-block " alt="logo amadeus">
13 </div> 16 </div>
14 </div> 17 </div>
15 18
16 <div class="row "> 19 <div class="row ">
17 - <div class="col-lg-9 col-lg-offset-2"> 20 + <div class="col-md-8 col-md-offset-2 col-sm-6 col-sm-offset-3">
18 <div class="card"> 21 <div class="card">
19 {% if message %} 22 {% if message %}
20 <div class="alert alert-danger fade in"> 23 <div class="alert alert-danger fade in">
@@ -23,7 +26,7 @@ @@ -23,7 +26,7 @@
23 26
24 {% endif %} 27 {% endif %}
25 <div class="card-content"> 28 <div class="card-content">
26 - <div class="card-body"> 29 +
27 <form id="form-login" class="form-group" method="post" action=""> 30 <form id="form-login" class="form-group" method="post" action="">
28 {% csrf_token %} 31 {% csrf_token %}
29 <div class="form-group is-empty"> 32 <div class="form-group is-empty">
@@ -38,7 +41,7 @@ @@ -38,7 +41,7 @@
38 <input form="form-login" type="password" name="password" class="form-control" id="inputPassword" placeholder="Password"> 41 <input form="form-login" type="password" name="password" class="form-control" id="inputPassword" placeholder="Password">
39 </div> 42 </div>
40 </div> 43 </div>
41 - <div class="col-md-offset-2 col-md-10"> 44 + <div class=" col-md-10">
42 <div class="checkbox"> 45 <div class="checkbox">
43 <label> 46 <label>
44 <input form="form-login" type="checkbox" name="checkbox"><span class="checkbox-material"><span class="check"></span></span> {% trans 'Remember Email' %} 47 <input form="form-login" type="checkbox" name="checkbox"><span class="checkbox-material"><span class="check"></span></span> {% trans 'Remember Email' %}
@@ -46,23 +49,27 @@ @@ -46,23 +49,27 @@
46 </div> 49 </div>
47 </div> 50 </div>
48 </form> 51 </form>
49 - </div> 52 +
50 53
51 - <footer class="card-footer" style="display: -webkit-box;">  
52 - <div class="col-md-6"> 54 +
  55 + <div class="col-md-6 col-xs-6">
53 <button type="button" class="btn btn-flat" formaction="#" style="position: initial;">{% trans 'Guest' %}</button> 56 <button type="button" class="btn btn-flat" formaction="#" style="position: initial;">{% trans 'Guest' %}</button>
54 </div> 57 </div>
55 - <div class="col-md-6"> 58 + <div class="col-md-6 col-xs-6">
56 <button type="submite" class="btn btn-flat btn-success" form="form-login" style="position: initial;">{% trans 'Login' %}</button> 59 <button type="submite" class="btn btn-flat btn-success" form="form-login" style="position: initial;">{% trans 'Login' %}</button>
57 </div> 60 </div>
58 - </footer> 61 +
59 </div> 62 </div>
60 </div> 63 </div>
61 </div> 64 </div>
62 </div> 65 </div>
63 <div class="row"> 66 <div class="row">
64 - <div class="col-lg-offset-2 col-lg-9"> 67 + <div class="col-lg-offset-2 col-lg-8 col-md-8 col-md-offset-2 col-sm-6 col-sm-offset-3">
65 <a class="btn btn-raised btn-primary btn-lg btn-block" href="{% url 'core:register' %}">{% trans 'Sign Up' %} </a> 68 <a class="btn btn-raised btn-primary btn-lg btn-block" href="{% url 'core:register' %}">{% trans 'Sign Up' %} </a>
66 </div> 69 </div>
67 </div> 70 </div>
68 {% endblock%} 71 {% endblock%}
  72 +
  73 +{% block rightbar %}
  74 +
  75 +{% endblock rightbar %}
69 \ No newline at end of file 76 \ No newline at end of file
courses/migrations/0008_auto_20160908_1332.py 0 → 100644
@@ -0,0 +1,28 @@ @@ -0,0 +1,28 @@
  1 +# -*- coding: utf-8 -*-
  2 +# Generated by Django 1.10 on 2016-09-08 16:32
  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 + ('courses', '0007_topic'),
  15 + ]
  16 +
  17 + operations = [
  18 + migrations.AddField(
  19 + model_name='subject',
  20 + name='professors',
  21 + field=models.ManyToManyField(related_name='subjects', to=settings.AUTH_USER_MODEL, verbose_name='Professors'),
  22 + ),
  23 + migrations.AddField(
  24 + model_name='topic',
  25 + name='owner',
  26 + field=models.ForeignKey(default=1, on_delete=django.db.models.deletion.CASCADE, related_name='topics', to=settings.AUTH_USER_MODEL, verbose_name='Owner'),
  27 + ),
  28 + ]
courses/migrations/0009_auto_20160908_1625.py 0 → 100644
@@ -0,0 +1,23 @@ @@ -0,0 +1,23 @@
  1 +# -*- coding: utf-8 -*-
  2 +# Generated by Django 1.10 on 2016-09-08 19:25
  3 +from __future__ import unicode_literals
  4 +
  5 +from django.db import migrations
  6 +
  7 +
  8 +class Migration(migrations.Migration):
  9 +
  10 + dependencies = [
  11 + ('courses', '0008_auto_20160908_1332'),
  12 + ]
  13 +
  14 + operations = [
  15 + migrations.AlterModelOptions(
  16 + name='subject',
  17 + options={'ordering': ('create_date',), 'verbose_name': 'Subject', 'verbose_name_plural': 'Subjects'},
  18 + ),
  19 + migrations.AlterModelOptions(
  20 + name='topic',
  21 + options={'ordering': ('create_date',), 'verbose_name': 'Topic', 'verbose_name_plural': 'Topics'},
  22 + ),
  23 + ]
courses/models.py
@@ -49,10 +49,11 @@ class Subject(models.Model): @@ -49,10 +49,11 @@ class Subject(models.Model):
49 create_date = models.DateTimeField(_('Creation Date'), auto_now_add = True) 49 create_date = models.DateTimeField(_('Creation Date'), auto_now_add = True)
50 update_date = models.DateTimeField(_('Date of last update'), auto_now=True) 50 update_date = models.DateTimeField(_('Date of last update'), auto_now=True)
51 course = models.ForeignKey(Course, verbose_name = _('Course'), related_name="subjects") 51 course = models.ForeignKey(Course, verbose_name = _('Course'), related_name="subjects")
  52 + professors = models.ManyToManyField(User,verbose_name=_('Professors'), related_name='subjects')
52 53
53 54
54 class Meta: 55 class Meta:
55 - 56 + ordering = ('create_date',)
56 verbose_name = _('Subject') 57 verbose_name = _('Subject')
57 verbose_name_plural = _('Subjects') 58 verbose_name_plural = _('Subjects')
58 59
@@ -67,10 +68,10 @@ class Topic(models.Model): @@ -67,10 +68,10 @@ class Topic(models.Model):
67 create_date = models.DateTimeField(_('Creation Date'), auto_now_add = True) 68 create_date = models.DateTimeField(_('Creation Date'), auto_now_add = True)
68 update_date = models.DateTimeField(_('Date of last update'), auto_now=True) 69 update_date = models.DateTimeField(_('Date of last update'), auto_now=True)
69 subject = models.ForeignKey(Subject, verbose_name = _('Subject'), related_name="topics") 70 subject = models.ForeignKey(Subject, verbose_name = _('Subject'), related_name="topics")
70 - 71 + owner = models.ForeignKey(User, verbose_name = _('Owner'), related_name="topics",default=1)
71 72
72 class Meta: 73 class Meta:
73 - 74 + ordering = ('create_date',)
74 verbose_name = _('Topic') 75 verbose_name = _('Topic')
75 verbose_name_plural = _('Topics') 76 verbose_name_plural = _('Topics')
76 77
courses/templates/module/create.html
@@ -1,80 +0,0 @@ @@ -1,80 +0,0 @@
1 -{% extends 'app/base.html' %}  
2 -  
3 -{% load static i18n %}  
4 -{% load widget_tweaks %}  
5 -  
6 -{% block breadcrumbs %}  
7 - <ol class="breadcrumb">  
8 - <li><a href="{% url 'app:index' %}">{% trans 'Home' %}</a></li>  
9 - <li><a href="{% url 'course:view' course.slug %}">{{ course }}</a></li>  
10 - <li class="active">{% trans 'Create Module' %}</li>  
11 - </ol>  
12 -{% endblock %}  
13 -  
14 -{% block sidebar %}  
15 - <div class="list-group">  
16 - <a href="{% url 'course:manage' %}" class="list-group-item">  
17 - {% trans 'Courses' %}  
18 - </a>  
19 - <a href="{% url 'course:create' %}" class="list-group-item">  
20 - {% trans 'Create Course' %}  
21 - </a>  
22 - <a href="{% url 'course:view' course.slug %}" class="list-group-item active">  
23 - {% trans 'Course Info' %}  
24 - </a>  
25 - <a href="{% url 'course:update' course.slug %}" class="list-group-item">  
26 - {% trans 'Edit Course' %}  
27 - </a>  
28 - <a href="{% url 'course:manage_mods' course.slug %}" class="list-group-item">  
29 - {% trans 'Manage Modules' %}  
30 - </a>  
31 - <a href="" class="list-group-item">  
32 - {% trans 'Participants' %}  
33 - </a>  
34 - <a href="" class="list-group-item">  
35 - {% trans 'Course avaliations' %}  
36 - </a>  
37 - <a href="" class="list-group-item">  
38 - {% trans 'Duplicate Course' %}  
39 - </a>  
40 - <a href="" class="list-group-item">  
41 - {% trans 'Delete Course' %}  
42 - </a>  
43 - </div>  
44 -  
45 -{% endblock %}  
46 -  
47 -{% block content %}  
48 - <div class="alert alert-info alert-dismissible" role="alert">  
49 - <button type="button" class="close" data-dismiss="alert" aria-label="Close">  
50 - <span aria-hidden="true">&times;</span>  
51 - </button>  
52 - <p>{% trans 'All fields are required' %}</p>  
53 - </div>  
54 -  
55 - <form method="post" action="" enctype="multipart/form-data">  
56 - {% csrf_token %}  
57 - {% for field in form %}  
58 - <div class="form-group{% if form.has_error %} has-error {% endif %}">  
59 - <label for="{{ field.auto_id }}">{{ field.label }}</label>  
60 - {% render_field field class='form-control input-sm' %}  
61 - <span id="helpBlock" class="help-block">{{ field.help_text }}</span>  
62 - {% if field.errors.length > 0 %}  
63 - <div class="alert alert-danger alert-dismissible" role="alert">  
64 - <button type="button" class="close" data-dismiss="alert" aria-label="Close">  
65 - <span aria-hidden="true">&times;</span>  
66 - </button>  
67 - <ul>  
68 - {% for error in field.errors %}  
69 - <li>{{ error }}</li>  
70 - {% endfor %}  
71 - </ul>  
72 - </div>  
73 - </div>  
74 - {% endif %}  
75 - </div>  
76 - {% endfor %}  
77 - <input type="submit" value="{% trans 'Save' %}" class="btn btn-sm btn-success" />  
78 - </form>  
79 - <br clear="all" />  
80 -{% endblock %}  
courses/templates/module/delete.html
@@ -1,53 +0,0 @@ @@ -1,53 +0,0 @@
1 -{% extends 'app/base.html' %}  
2 -  
3 -{% load static i18n %}  
4 -  
5 -{% block breadcrumbs %}  
6 - <ol class="breadcrumb">  
7 - <li><a href="{% url 'app:index' %}">{% trans 'Home' %}</a></li>  
8 - <li><a href="{% url 'course:view' course.slug %}">{{ course }}</a></li>  
9 - <li class="active">{% trans 'Manage Modules' %}</li>  
10 - </ol>  
11 -{% endblock %}  
12 -  
13 -{% block sidebar %}  
14 - <div class="list-group">  
15 - <a href="{% url 'course:manage' %}" class="list-group-item">  
16 - {% trans 'Courses' %}  
17 - </a>  
18 - <a href="{% url 'course:create' %}" class="list-group-item">  
19 - {% trans 'Create Course' %}  
20 - </a>  
21 - <a href="{% url 'course:view' course.slug %}" class="list-group-item active">  
22 - {% trans 'Course Info' %}  
23 - </a>  
24 - <a href="{% url 'course:update' course.slug %}" class="list-group-item">  
25 - {% trans 'Edit Course' %}  
26 - </a>  
27 - <a href="{% url 'course:manage_mods' course.slug %}" class="list-group-item">  
28 - {% trans 'Manage Modules' %}  
29 - </a>  
30 - <a href="" class="list-group-item">  
31 - {% trans 'Participants' %}  
32 - </a>  
33 - <a href="" class="list-group-item">  
34 - {% trans 'Course avaliations' %}  
35 - </a>  
36 - <a href="" class="list-group-item">  
37 - {% trans 'Duplicate Course' %}  
38 - </a>  
39 - <a href="" class="list-group-item">  
40 - {% trans 'Delete Course' %}  
41 - </a>  
42 - </div>  
43 -  
44 -{% endblock %}  
45 -  
46 -{% block content %}  
47 - <form action="" method="post">  
48 - {% csrf_token %}  
49 - <p>{% trans 'Are you sure you want to delete the module' %} "{{ object }}"?</p>  
50 - <input type="submit" class="btn btn-success btn-sm" value="{% trans 'Yes' %}" />  
51 - <a href="{% url 'course:manage' %}" class="btn btn-danger btn-sm">{% trans 'No' %}</a>  
52 - </form>  
53 -{% endblock %}  
courses/templates/module/index.html
@@ -1,128 +0,0 @@ @@ -1,128 +0,0 @@
1 -{% extends 'app/base.html' %}  
2 -  
3 -{% load static i18n permission_tags %}  
4 -  
5 -{% block breadcrumbs %}  
6 - <ol class="breadcrumb">  
7 - <li><a href="{% url 'app:index' %}">{% trans 'Home' %}</a></li>  
8 - <li><a href="{% url 'course:view' course.slug %}">{{ course }}</a></li>  
9 - <li class="active">{% trans 'Manage Modules' %}</li>  
10 - </ol>  
11 -{% endblock %}  
12 -  
13 -{% block sidebar %}  
14 - <div class="list-group">  
15 - <a href="{% url 'course:manage' %}" class="list-group-item">  
16 - {% trans 'Courses' %}  
17 - </a>  
18 - <a href="{% url 'course:view' course.slug %}" class="list-group-item active">  
19 - {% trans 'Course Info' %}  
20 - </a>  
21 - <a href="{% url 'course:manage_mods' course.slug %}" class="list-group-item">  
22 - {% trans 'Manage Modules' %}  
23 - </a>  
24 - {% if user|has_role:'professor, system_admin' %}  
25 - <a href="{% url 'course:create' %}" class="list-group-item">  
26 - {% trans 'Create Course' %}  
27 - </a>  
28 - <a href="{% url 'course:update' course.slug %}" class="list-group-item">  
29 - {% trans 'Edit Course' %}  
30 - </a>  
31 - <a href="" class="list-group-item">  
32 - {% trans 'Participants' %}  
33 - </a>  
34 - <a href="" class="list-group-item">  
35 - {% trans 'Course avaliations' %}  
36 - </a>  
37 - <a href="" class="list-group-item">  
38 - {% trans 'Duplicate Course' %}  
39 - </a>  
40 - <a href="" class="list-group-item">  
41 - {% trans 'Delete Course' %}  
42 - </a>  
43 - {% endif %}  
44 - </div>  
45 -  
46 -{% endblock %}  
47 -  
48 -{% block content %}  
49 - {% if messages %}  
50 - {% for message in messages %}  
51 - <div class="alert alert-success alert-dismissible" role="alert">  
52 - <button type="button" class="close" data-dismiss="alert" aria-label="Close">  
53 - <span aria-hidden="true">&times;</span>  
54 - </button>  
55 - <p>{{ message }}</p>  
56 - </div>  
57 - {% endfor %}  
58 - {% endif %}  
59 -  
60 - <div class="row well well-inverse">  
61 - <div class="col-md-2">  
62 - <img src="{{ course.image.url }}" class="img-responsive" />  
63 - </div>  
64 - <div class="col-md-10">  
65 - <div class="row">  
66 - <div class="col-md-12">  
67 - {% if user|has_role:'professor, system_admin' %}  
68 - <div class="pull-right">  
69 - <a href="{% url 'course:create_mods' course.slug %}" class="btn btn-sm btn-success">  
70 - {% trans 'Create Module' %}  
71 - </a>  
72 - </div>  
73 - {% endif %}  
74 - <h4>  
75 - <a href="{% url 'course:view' course.slug %}">  
76 - {{ course }}  
77 - </a>  
78 - </h4>  
79 - <span class="label label-info">{{ course.category }}</span>  
80 - <span class="label label-warning">{{ course.max_students }} {% trans 'students maximum' %}</span>  
81 - </div>  
82 - <div class="col-md-12">  
83 - <strong>{% trans 'Period:' %} </strong> <em>de</em> <u>{{ course.init_date }}</u> <em>até</em> <u>{{ course.end_date }}</u>  
84 - </div>  
85 - </div>  
86 - </div>  
87 - </div>  
88 -  
89 - {% if modules|length > 0 %}  
90 - <div class="panel panel-default">  
91 - <div class="panel-heading">  
92 - <h3 class="panel-title">{% trans 'Modules' %}</h3>  
93 - </div>  
94 - <div class="panel-body">  
95 - <ul class="list-group">  
96 - {% for module in modules %}  
97 - <li class="list-group-item">  
98 - <div class="media">  
99 - <div class="col-sm-10">  
100 - <div class="media-body">  
101 - <h4 class="media-heading">{{ module }}</h4>  
102 - <p>{{ module.description|linebreaks }}</p>  
103 - </div>  
104 - </div>  
105 - <div class="col-sm-2" style="padding-top: 10px">  
106 - {% if module.visible %}  
107 - <span class="label label-success">{% trans 'Visible' %}</span>  
108 - {% else %}  
109 - <span class="label label-danger">{% trans 'Invisible' %}</span>  
110 - {% endif %}  
111 - <a href="{% url 'course:update_mods' course.slug module.slug %}" class="btn btn-sm btn-primary" style="margin-top: 10px">  
112 - <span class="glyphicon glyphicon-edit"></span>  
113 - </a>  
114 - <a href="{% url 'course:delete_mods' course.slug module.slug %}" class="btn btn-sm btn-danger" style="margin-top: 10px">  
115 - <span class="glyphicon glyphicon-trash"></span>  
116 - </a>  
117 - </div>  
118 - </div>  
119 - </li>  
120 - {% endfor %}  
121 - </ul>  
122 - </div>  
123 - </div>  
124 - {% else %}  
125 - {% trans 'No modules found' %}  
126 - {% endif %}  
127 -  
128 -{% endblock %}  
courses/templates/module/update.html
@@ -1,80 +0,0 @@ @@ -1,80 +0,0 @@
1 -{% extends 'app/base.html' %}  
2 -  
3 -{% load static i18n %}  
4 -{% load widget_tweaks %}  
5 -  
6 -{% block breadcrumbs %}  
7 - <ol class="breadcrumb">  
8 - <li><a href="{% url 'app:index' %}">{% trans 'Home' %}</a></li>  
9 - <li><a href="{% url 'course:view' course.slug %}">{{ course }}</a></li>  
10 - <li class="active">{% trans 'Edit Module' %}</li>  
11 - </ol>  
12 -{% endblock %}  
13 -  
14 -{% block sidebar %}  
15 - <div class="list-group">  
16 - <a href="{% url 'course:manage' %}" class="list-group-item">  
17 - {% trans 'Courses' %}  
18 - </a>  
19 - <a href="{% url 'course:create' %}" class="list-group-item">  
20 - {% trans 'Create Course' %}  
21 - </a>  
22 - <a href="{% url 'course:view' course.slug %}" class="list-group-item active">  
23 - {% trans 'Course Info' %}  
24 - </a>  
25 - <a href="{% url 'course:update' course.slug %}" class="list-group-item">  
26 - {% trans 'Edit Course' %}  
27 - </a>  
28 - <a href="{% url 'course:manage_mods' course.slug %}" class="list-group-item">  
29 - {% trans 'Manage Modules' %}  
30 - </a>  
31 - <a href="" class="list-group-item">  
32 - {% trans 'Participants' %}  
33 - </a>  
34 - <a href="" class="list-group-item">  
35 - {% trans 'Course avaliations' %}  
36 - </a>  
37 - <a href="" class="list-group-item">  
38 - {% trans 'Duplicate Course' %}  
39 - </a>  
40 - <a href="" class="list-group-item">  
41 - {% trans 'Delete Course' %}  
42 - </a>  
43 - </div>  
44 -  
45 -{% endblock %}  
46 -  
47 -{% block content %}  
48 - <div class="alert alert-info alert-dismissible" role="alert">  
49 - <button type="button" class="close" data-dismiss="alert" aria-label="Close">  
50 - <span aria-hidden="true">&times;</span>  
51 - </button>  
52 - <p>{% trans 'All fields are required' %}</p>  
53 - </div>  
54 -  
55 - <form method="post" action="" enctype="multipart/form-data">  
56 - {% csrf_token %}  
57 - {% for field in form %}  
58 - <div class="form-group{% if form.has_error %} has-error {% endif %}">  
59 - <label for="{{ field.auto_id }}">{{ field.label }}</label>  
60 - {% render_field field class='form-control input-sm' %}  
61 - <span id="helpBlock" class="help-block">{{ field.help_text }}</span>  
62 - {% if field.errors.length > 0 %}  
63 - <div class="alert alert-danger alert-dismissible" role="alert">  
64 - <button type="button" class="close" data-dismiss="alert" aria-label="Close">  
65 - <span aria-hidden="true">&times;</span>  
66 - </button>  
67 - <ul>  
68 - {% for error in field.errors %}  
69 - <li>{{ error }}</li>  
70 - {% endfor %}  
71 - </ul>  
72 - </div>  
73 - </div>  
74 - {% endif %}  
75 - </div>  
76 - {% endfor %}  
77 - <input type="submit" value="{% trans 'Save' %}" class="btn btn-sm btn-success" />  
78 - </form>  
79 - <br clear="all" />  
80 -{% endblock %}  
courses/templates/subject/create.html 0 → 100644
@@ -0,0 +1,25 @@ @@ -0,0 +1,25 @@
  1 +{% extends 'subject/index.html' %}
  2 +
  3 +{% load static i18n permission_tags widget_tweaks %}
  4 +
  5 +{% block content %}
  6 +
  7 + <div class="panel panel-default">
  8 + <div class="panel-body">
  9 + <form class="form-group " method="post" action="">
  10 + {% csrf_token %}
  11 + {% for field in form %}
  12 + <div class="form-group {% if field.errors %} has-error{% endif %}">
  13 + <label for="{{ field.auto_id }}" class="control-label label-static"> {{ field.label }}</label>
  14 +
  15 + {% render_field field class='form-control' placeholder=field.label%}
  16 + <span class="help-block">{{ field.help_text }}</span>
  17 + </div>
  18 + {% endfor %}
  19 + <div class="col-lg-offset-4 col-lg-4">
  20 + <button type="submite" class="btn btn-raised btn-primary btn-lg btn-block">{% trans 'Create' %}</button>
  21 + </div>
  22 + </form>
  23 + </div>
  24 + </div>
  25 +{% endblock content %}
courses/templates/subject/delete.html 0 → 100644
@@ -0,0 +1,18 @@ @@ -0,0 +1,18 @@
  1 +{% extends 'subject/index.html' %}
  2 +
  3 +{% load static i18n permission_tags widget_tweaks %}
  4 +
  5 +{% block content %}
  6 +
  7 +<div class="panel panel-default">
  8 + <div class="panel-body">
  9 + <form action="" method="post">
  10 + {% csrf_token %}
  11 + <h2>{% trans 'Are you sure you want to delete the category' %} "{{subject}}"?</h2>
  12 + <input type="submit" class="btn btn-raised btn-success btn-lg" value="{% trans 'Yes' %}" />
  13 + <a href="{% url 'course:view_subject' subject.slug%}" class="btn btn-raised btn-danger btn-lg">{% trans 'No' %}</a>
  14 + </form>
  15 + </div>
  16 +</div>
  17 +
  18 +{% endblock content %}
courses/templates/subject/form_view_student.html
@@ -9,6 +9,6 @@ @@ -9,6 +9,6 @@
9 </div> 9 </div>
10 </div> 10 </div>
11 <div class="panel-body"> 11 <div class="panel-body">
12 - <p>{{topic.description}}</p> 12 + <p>{{topic.description|linebreaks}}</p>
13 </div> 13 </div>
14 </div> 14 </div>
courses/templates/subject/form_view_teacher.html
@@ -7,11 +7,11 @@ @@ -7,11 +7,11 @@
7 <h3>{{topic}}</h3> 7 <h3>{{topic}}</h3>
8 </div> 8 </div>
9 <div class="col-md-3 col-sm-3"> 9 <div class="col-md-3 col-sm-3">
10 - <a href="#" class="btn">{% trans "edit" %}</a> 10 + <a href="{% url 'course:update_topic' topic.slug%}" class="btn">{% trans "edit" %}</a>
11 </div> 11 </div>
12 </div> 12 </div>
13 </div> 13 </div>
14 <div class="panel-body"> 14 <div class="panel-body">
15 - <p>{{topic.description}}</p> 15 + <p>{{topic.description|linebreaks}}</p>
16 </div> 16 </div>
17 </div> 17 </div>
courses/templates/subject/index.html
@@ -24,36 +24,54 @@ @@ -24,36 +24,54 @@
24 <a href="{% url 'course:view_subject' subject.slug%}" class="btn btn-default">{{subject}}</a> 24 <a href="{% url 'course:view_subject' subject.slug%}" class="btn btn-default">{{subject}}</a>
25 {% endfor %} 25 {% endfor %}
26 </div> 26 </div>
27 -  
28 </div> 27 </div>
  28 +
  29 + {% if user|has_role:'system_admin' or user|has_role:'professor' %}
  30 + <a href="{% url 'course:create_subject' course.slug %}" class="btn btn-primary btn-md btn-block">{% trans "Create Subject" %}</a>
  31 + {% endif %}
29 {% endblock %} 32 {% endblock %}
30 33
31 {% block content %} 34 {% block content %}
32 <div class="panel panel-info"> 35 <div class="panel panel-info">
33 <div class="panel-heading"> 36 <div class="panel-heading">
34 - <h3 class="panel-title">{% trans "Presentation Subject" %}</h3> 37 + <div class="row">
  38 + <div class="col-md-7 col-sm-7">
  39 + <h3>{% trans "Presentation Subject" %}</h3>
  40 + </div>
  41 + <div class="col-md-2 col-sm-2">
  42 + {% if user|has_role:'system_admin' or user in subject.professors %}
  43 + <a href="{% url 'course:update_subject' subject.slug%}" class="btn">{% trans "edit" %}</a>
  44 + {% endif %}
  45 + </div>
  46 + <div class="col-md-3 col-sm-3">
  47 + {% if user|has_role:'system_admin' or user in subject.professors %}
  48 + <a href="{% url 'course:delete_subject' subject.slug%}" class="btn">{% trans "delete" %}</a>
  49 + {% endif %}
  50 + </div>
  51 + </div>
35 </div> 52 </div>
36 <div class="panel-body"> 53 <div class="panel-body">
37 <p> 54 <p>
38 - {{subject.description}} 55 + {{subject.description|linebreaks}}
39 </p> 56 </p>
40 </div> 57 </div>
41 </div> 58 </div>
42 {% for topic in topics %} 59 {% for topic in topics %}
43 - {% if user|has_role:'professor' or user|has_role:'system_admin'%} 60 + {% if user|has_role:'system_admin' or topic.owner == user%}
44 {% include "subject/form_view_teacher.html" %} 61 {% include "subject/form_view_teacher.html" %}
45 {% else %} 62 {% else %}
46 {% include "subject/form_view_student.html" %} 63 {% include "subject/form_view_student.html" %}
47 {% endif %} 64 {% endif %}
48 {% endfor %} 65 {% endfor %}
49 66
  67 + <a name="create_topic" class="btn btn-primary btn-md btn-block" href="{% url 'course:create_topic' subject.slug %}">{% trans "Create Topic" %}</a>
50 {% endblock %} 68 {% endblock %}
51 69
52 {% block rightbar %} 70 {% block rightbar %}
53 71
54 <div class="panel panel-warning"> 72 <div class="panel panel-warning">
55 <div class="panel-heading"> 73 <div class="panel-heading">
56 - <h3 class="panel-title">Pending Stuffs</h3> 74 + <h3 class="panel-title">{% trans "Pending Stuffs" %}</h3>
57 </div> 75 </div>
58 <div class="panel-body"> 76 <div class="panel-body">
59 77
courses/templates/subject/update.html 0 → 100644
@@ -0,0 +1,25 @@ @@ -0,0 +1,25 @@
  1 +{% extends 'subject/index.html' %}
  2 +
  3 +{% load static i18n permission_tags widget_tweaks %}
  4 +
  5 +{% block content %}
  6 +
  7 + <div class="panel panel-default">
  8 + <div class="panel-body">
  9 + <form class="form-group " method="post" action="">
  10 + {% csrf_token %}
  11 + {% for field in form %}
  12 + <div class="form-group {% if field.errors %} has-error{% endif %}">
  13 + <label for="{{ field.auto_id }}" class="control-label label-static"> {{ field.label }}</label>
  14 +
  15 + {% render_field field class='form-control' placeholder=field.label%}
  16 + <span class="help-block">{{ field.help_text }}</span>
  17 + </div>
  18 + {% endfor %}
  19 + <div class="col-lg-offset-4 col-lg-4">
  20 + <button type="submite" class="btn btn-raised btn-primary btn-lg btn-block">{% trans 'Update' %}</button>
  21 + </div>
  22 + </form>
  23 + </div>
  24 + </div>
  25 +{% endblock content %}
courses/templates/topic/create.html 0 → 100644
@@ -0,0 +1,26 @@ @@ -0,0 +1,26 @@
  1 +{% extends 'subject/index.html' %}
  2 +
  3 +{% load static i18n permission_tags widget_tweaks %}
  4 +
  5 +{% block content %}
  6 +
  7 + <div class="panel panel-default">
  8 + <div class="panel-body">
  9 + <form class="form-group " method="post" action="">
  10 + {% csrf_token %}
  11 + {% for field in form %}
  12 + <div class="form-group {% if field.errors %} has-error{% endif %}">
  13 + <label for="{{ field.auto_id }}" class="control-label label-static"> {{ field.label }}</label>
  14 +
  15 + {% render_field field class='form-control' placeholder=field.label%}
  16 + <span class="help-block">{{ field.help_text }}</span>
  17 + </div>
  18 + {% endfor %}
  19 + <div class="col-lg-offset-4 col-lg-4">
  20 + <button type="submite" class="btn btn-raised btn-primary btn-lg btn-block">{% trans 'Create' %}</button>
  21 +
  22 + </div>
  23 + </form>
  24 + </div>
  25 + </div>
  26 +{% endblock content %}
courses/templates/topic/update.html 0 → 100644
@@ -0,0 +1,27 @@ @@ -0,0 +1,27 @@
  1 +{% extends 'subject/index.html' %}
  2 +
  3 +{% load static i18n permission_tags widget_tweaks %}
  4 +
  5 +{% block content %}
  6 +
  7 +<div class="panel panel-default">
  8 + <div class="panel-body">
  9 + <form class="form-group " method="post" action="">
  10 + {% csrf_token %}
  11 + {% for field in form %}
  12 + <div class="form-group {% if field.errors %} has-error{% endif %}">
  13 + <label for="{{ field.auto_id }}" class="control-label label-static"> {{ field.label }}</label>
  14 +
  15 + {% render_field field class='form-control' placeholder=field.label%}
  16 + <span class="help-block">{{ field.help_text }}</span>
  17 + </div>
  18 + {% endfor %}
  19 + <div class="col-lg-offset-4 col-lg-4">
  20 + <button type="submite" class="btn btn-raised btn-primary btn-lg btn-block">{% trans 'Update' %}</button>
  21 +
  22 + </div>
  23 + </form>
  24 + </div>
  25 +</div>
  26 +
  27 +{% endblock content %}
courses/urls.py
@@ -14,9 +14,10 @@ urlpatterns = [ @@ -14,9 +14,10 @@ urlpatterns = [
14 url(r'^categories/edit/(?P<slug>[\w_-]+)/$', views.UpdateCatView.as_view(), name='update_cat'), 14 url(r'^categories/edit/(?P<slug>[\w_-]+)/$', views.UpdateCatView.as_view(), name='update_cat'),
15 url(r'^categories/(?P<slug>[\w_-]+)/$', views.ViewCat.as_view(), name='view_cat'), 15 url(r'^categories/(?P<slug>[\w_-]+)/$', views.ViewCat.as_view(), name='view_cat'),
16 url(r'^categories/delete/(?P<slug>[\w_-]+)/$', views.DeleteCatView.as_view(), name='delete_cat'), 16 url(r'^categories/delete/(?P<slug>[\w_-]+)/$', views.DeleteCatView.as_view(), name='delete_cat'),
17 - url(r'^course/(?P<slug>[\w_-]+)/subjects/$', views.SubjectsView.as_view(), name='view_subject'),  
18 - # url(r'^course/(?P<slug>[\w_-]+)/modules/create/$', views.CreateModView.as_view(), name='create_mods'),  
19 - # url(r'^course/(?P<slug_course>[\w_-]+)/modules/edit/(?P<slug>[\w_-]+)/$', views.UpdateModView.as_view(), name='update_mods'),  
20 - # url(r'^course/(?P<slug_course>[\w_-]+)/modules/delete/(?P<slug>[\w_-]+)/$', views.DeleteModView.as_view(), name='delete_mods'),  
21 - # url(r'^course/(?P<slug>[\w_-]+)/subject$', views.ViewSubject.as_view(), name='view_subject'), 17 + url(r'^course/subjects/(?P<slug>[\w_-]+)/$', views.SubjectsView.as_view(), name='view_subject'),
  18 + url(r'^course/topics/create/(?P<slug>[\w_-]+)/$', views.CreateTopicView.as_view(), name='create_topic'),
  19 + url(r'^course/topics/update/(?P<slug>[\w_-]+)/$', views.UpdateTopicView.as_view(), name='update_topic'),
  20 + url(r'^course/subjects/create/(?P<slug>[\w_-]+)/$', views.CreateSubjectView.as_view(), name='create_subject'),
  21 + url(r'^course/subjects/update/(?P<slug>[\w_-]+)/$', views.UpdateSubjectView.as_view(), name='update_subject'),
  22 + url(r'^course/subjects/delete/(?P<slug>[\w_-]+)/$', views.DeleteSubjectView.as_view(), name='delete_subject'),
22 ] 23 ]
courses/views.py
@@ -8,9 +8,11 @@ from rolepermissions.mixins import HasRoleMixin @@ -8,9 +8,11 @@ from rolepermissions.mixins import HasRoleMixin
8 from django.core.urlresolvers import reverse_lazy 8 from django.core.urlresolvers import reverse_lazy
9 from django.utils.translation import ugettext_lazy as _ 9 from django.utils.translation import ugettext_lazy as _
10 from slugify import slugify 10 from slugify import slugify
  11 +from rolepermissions.verifications import has_role
  12 +from django.db.models import Q
11 13
12 -from .forms import CourseForm, CategoryForm, SubjectForm  
13 -from .models import Course, Subject, Category 14 +from .forms import CourseForm, CategoryForm, SubjectForm,TopicForm
  15 +from .models import Course, Subject, Category,Topic
14 16
15 17
16 class IndexView(LoginRequiredMixin, generic.ListView): 18 class IndexView(LoginRequiredMixin, generic.ListView):
@@ -193,116 +195,148 @@ class SubjectsView(LoginRequiredMixin, generic.ListView): @@ -193,116 +195,148 @@ class SubjectsView(LoginRequiredMixin, generic.ListView):
193 template_name = 'subject/index.html' 195 template_name = 'subject/index.html'
194 context_object_name = 'subjects' 196 context_object_name = 'subjects'
195 model = Subject 197 model = Subject
196 - # paginate_by = 5  
197 198
198 def get_queryset(self): 199 def get_queryset(self):
199 subject = get_object_or_404(Subject, slug = self.kwargs.get('slug')) 200 subject = get_object_or_404(Subject, slug = self.kwargs.get('slug'))
200 course = subject.course 201 course = subject.course
201 - return course.subjects.filter(visible=True) 202 + context = course.subjects.filter(visible=True)
  203 + if (self.request.user in subject.professors.all() or has_role(self.request.user,'system_admin')):
  204 + context = course.subjects.all()
  205 + return context
202 206
203 def get_context_data(self, **kwargs): 207 def get_context_data(self, **kwargs):
204 - # print ("Deu Certo")  
205 subject = get_object_or_404(Subject, slug = self.kwargs.get('slug')) 208 subject = get_object_or_404(Subject, slug = self.kwargs.get('slug'))
206 - # print (course)  
207 - # print (course.slug)  
208 - # print (course.subjects.filter(visible=True))  
209 context = super(SubjectsView, self).get_context_data(**kwargs) 209 context = super(SubjectsView, self).get_context_data(**kwargs)
210 context['course'] = subject.course 210 context['course'] = subject.course
211 context['subject'] = subject 211 context['subject'] = subject
212 context['topics'] = subject.topics.all() 212 context['topics'] = subject.topics.all()
213 - # print (context)  
214 return context 213 return context
215 214
216 -# class CreateSubjectView(LoginRequiredMixin, HasRoleMixin, generic.edit.CreateView):  
217 -#  
218 -# allowed_roles = ['professor', 'system_admin']  
219 -# login_url = reverse_lazy("core:home")  
220 -# redirect_field_name = 'next'  
221 -# template_name = 'module/create.html'  
222 -# form_class = SubjectForm  
223 -#  
224 -# def get_success_url(self):  
225 -# return reverse_lazy('course:manage_mods', kwargs={'slug' : self.object.course.slug})  
226 -#  
227 -# def get_context_data(self, **kwargs):  
228 -# course = get_object_or_404(Course, slug = self.kwargs.get('slug'))  
229 -# context = super(CreateModView, self).get_context_data(**kwargs)  
230 -# context['course'] = course  
231 -#  
232 -# return context  
233 -#  
234 -# def form_valid(self, form):  
235 -# course = get_object_or_404(Course, slug = self.kwargs.get('slug'))  
236 -#  
237 -# self.object = form.save(commit = False)  
238 -# self.object.slug = slugify(self.object.name)  
239 -# self.object.course = course  
240 -# self.object.save()  
241 -#  
242 -# return super(CreateModView, self).form_valid(form)  
243 -#  
244 -# def render_to_response(self, context, **response_kwargs):  
245 -# messages.success(self.request, _('Module created successfully!'))  
246 -#  
247 -# return self.response_class(request=self.request, template=self.get_template_names(), context=context, using=self.template_engine)  
248 -#  
249 -# class UpdateModView(LoginRequiredMixin, HasRoleMixin, generic.UpdateView):  
250 -#  
251 -# allowed_roles = ['professor', 'system_admin']  
252 -# login_url = reverse_lazy("core:home")  
253 -# redirect_field_name = 'next'  
254 -# template_name = 'module/update.html'  
255 -# model = Module  
256 -# form_class = ModuleForm  
257 -#  
258 -# def get_success_url(self):  
259 -# return reverse_lazy('course:manage_mods', kwargs={'slug' : self.object.course.slug})  
260 -#  
261 -# def get_context_data(self, **kwargs):  
262 -# course = get_object_or_404(Course, slug = self.kwargs.get('slug_course'))  
263 -# context = super(UpdateModView, self).get_context_data(**kwargs)  
264 -# context['course'] = course  
265 -#  
266 -# return context  
267 -#  
268 -# def form_valid(self, form):  
269 -# self.object = form.save(commit = False)  
270 -# self.object.slug = slugify(self.object.name)  
271 -# self.object.save()  
272 -#  
273 -# return super(UpdateModView, self).form_valid(form)  
274 -#  
275 -# def render_to_response(self, context, **response_kwargs):  
276 -# messages.success(self.request, _('Module edited successfully!'))  
277 -#  
278 -# return self.response_class(request=self.request, template=self.get_template_names(), context=context, using=self.template_engine)  
279 -#  
280 -# class DeleteModView(LoginRequiredMixin, HasRoleMixin, generic.DeleteView):  
281 -#  
282 -# allowed_roles = ['professor', 'system_admin']  
283 -# login_url = reverse_lazy("core:home")  
284 -# redirect_field_name = 'next'  
285 -# model = Module  
286 -# template_name = 'module/delete.html'  
287 -#  
288 -# def get_success_url(self):  
289 -# return reverse_lazy('course:manage_mods', kwargs={'slug' : self.object.course.slug})  
290 -#  
291 -# def get_context_data(self, **kwargs):  
292 -# course = get_object_or_404(Course, slug = self.kwargs.get('slug_course'))  
293 -# context = super(DeleteModView, self).get_context_data(**kwargs)  
294 -# context['course'] = course  
295 -#  
296 -# return context  
297 -#  
298 -# def render_to_response(self, context, **response_kwargs):  
299 -# messages.success(self.request, _('Module deleted successfully!'))  
300 -#  
301 -# return self.response_class(request=self.request, template=self.get_template_names(), context=context, using=self.template_engine)  
302 -  
303 -# class ViewSubject(LoginRequiredMixin, generic.DetailView):  
304 -# login_url = reverse_lazy("core:home")  
305 -# redirect_field_name = 'next'  
306 -# model = Course  
307 -# template_name = 'subject/index.html'  
308 -# context_object_name = 'course' 215 +class CreateTopicView(LoginRequiredMixin, HasRoleMixin, generic.edit.CreateView):
  216 +
  217 + allowed_roles = ['professor', 'system_admin','student']
  218 + login_url = reverse_lazy("core:home")
  219 + redirect_field_name = 'next'
  220 + template_name = 'topic/create.html'
  221 + form_class = TopicForm
  222 +
  223 + def get_success_url(self):
  224 + return reverse_lazy('course:view_subject', kwargs={'slug' : self.object.subject.slug})
  225 +
  226 + def get_context_data(self, **kwargs):
  227 + context = super(CreateTopicView, self).get_context_data(**kwargs)
  228 + subject = get_object_or_404(Subject, slug = self.kwargs.get('slug'))
  229 + context['course'] = subject.course
  230 + context['subject'] = subject
  231 + context['subjects'] = subject.course.subjects.filter(Q(visible=True) | Q(professors__in=[self.request.user]))
  232 + if (has_role(self.request.user,'system_admin')):
  233 + context['subjects'] = subject.course.subjects.all()
  234 + return context
  235 +
  236 + def form_valid(self, form):
  237 + subject = get_object_or_404(Subject, slug = self.kwargs.get('slug'))
  238 +
  239 + self.object = form.save(commit = False)
  240 + self.object.subject = subject
  241 + self.object.owner = self.request.user
  242 + self.object.save()
  243 +
  244 + return super(CreateTopicView, self).form_valid(form)
  245 +
  246 +class UpdateTopicView(LoginRequiredMixin, HasRoleMixin, generic.UpdateView):
  247 +
  248 + allowed_roles = ['professor', 'system_admin','student']
  249 + login_url = reverse_lazy("core:home")
  250 + redirect_field_name = 'next'
  251 + template_name = 'topic/update.html'
  252 + form_class = TopicForm
  253 +
  254 + def get_object(self, queryset=None):
  255 + return get_object_or_404(Topic, slug = self.kwargs.get('slug'))
  256 +
  257 + def get_success_url(self):
  258 + return reverse_lazy('course:view_subject', kwargs={'slug' : self.object.subject.slug})
  259 +
  260 + def get_context_data(self, **kwargs):
  261 + context = super(UpdateTopicView, self).get_context_data(**kwargs)
  262 + topic = get_object_or_404(Topic, slug = self.kwargs.get('slug'))
  263 + context['course'] = topic.subject.course
  264 + context['subject'] = topic.subject
  265 + context['subjects'] = topic.subject.course.subjects.filter(Q(visible=True) | Q(professors__in=[self.request.user]))
  266 + if (has_role(self.request.user,'system_admin')):
  267 + context['subjects'] = topic.subject.course.subjects.all()
  268 + return context
  269 +
  270 +class CreateSubjectView(LoginRequiredMixin, HasRoleMixin, generic.edit.CreateView):
  271 +
  272 + allowed_roles = ['professor', 'system_admin']
  273 + login_url = reverse_lazy("core:home")
  274 + redirect_field_name = 'next'
  275 + template_name = 'subject/create.html'
  276 + form_class = SubjectForm
  277 +
  278 + def get_success_url(self):
  279 + return reverse_lazy('course:view_subject', kwargs={'slug' : self.object.slug})
  280 +
  281 + def get_context_data(self, **kwargs):
  282 + context = super(CreateSubjectView, self).get_context_data(**kwargs)
  283 + course = get_object_or_404(Course, slug = self.kwargs.get('slug'))
  284 + context['course'] = course
  285 + context['subjects'] = course.subjects.filter(Q(visible=True) | Q(professors__in=[self.request.user]))
  286 + if (has_role(self.request.user,'system_admin')):
  287 + context['subjects'] = course.subjects.all()
  288 + return context
  289 +
  290 + def form_valid(self, form):
  291 + course = get_object_or_404(Course, slug = self.kwargs.get('slug'))
  292 +
  293 + self.object = form.save(commit = False)
  294 + self.object.course = course
  295 + self.object.professor = self.request.user
  296 + self.object.save()
  297 +
  298 + return super(CreateSubjectView, self).form_valid(form)
  299 +
  300 +
  301 +class UpdateSubjectView(LoginRequiredMixin, HasRoleMixin, generic.UpdateView):
  302 +
  303 + allowed_roles = ['professor', 'system_admin']
  304 + login_url = reverse_lazy("core:home")
  305 + redirect_field_name = 'next'
  306 + template_name = 'subject/update.html'
  307 + form_class = SubjectForm
  308 +
  309 + def get_object(self, queryset=None):
  310 + return get_object_or_404(Subject, slug = self.kwargs.get('slug'))
  311 +
  312 + def get_success_url(self):
  313 + return reverse_lazy('course:view_subject', kwargs={'slug' : self.object.slug})
  314 +
  315 + def get_context_data(self, **kwargs):
  316 + context = super(UpdateSubjectView, self).get_context_data(**kwargs)
  317 + context['course'] = self.object.course
  318 + context['subject'] = self.object
  319 + context['subjects'] = self.object.course.subjects.filter(Q(visible=True) | Q(professors__in=[self.request.user]))
  320 + if (has_role(self.request.user,'system_admin')):
  321 + context['subjects'] = self.object.course.subjects.all()
  322 + return context
  323 +
  324 +class DeleteSubjectView(LoginRequiredMixin, HasRoleMixin, generic.DeleteView):
  325 +
  326 + allowed_roles = ['professor', 'system_admin']
  327 + login_url = reverse_lazy("core:home")
  328 + redirect_field_name = 'next'
  329 + model = Subject
  330 + template_name = 'subject/delete.html'
  331 +
  332 + def get_context_data(self, **kwargs):
  333 + context = super(DeleteSubjectView, self).get_context_data(**kwargs)
  334 + context['course'] = self.object.course
  335 + context['subject'] = self.object
  336 + context['subjects'] = self.object.course.subjects.filter(Q(visible=True) | Q(professors__in=[self.request.user]))
  337 + if (has_role(self.request.user,'system_admin')):
  338 + context['subjects'] = self.object.course.subjects.all()
  339 + return context
  340 +
  341 + def get_success_url(self):
  342 + return reverse_lazy('course:view_subject', kwargs={'slug' : self.object.course.subjects.all()[0].slug})
logs/log_file_06-09-2016.txt
@@ -93,3 +93,8 @@ @@ -93,3 +93,8 @@
93 06/09/2016 21:34:11 - test - Acessou home 93 06/09/2016 21:34:11 - test - Acessou home
94 06/09/2016 21:38:44 - test - Entrou no sistema 94 06/09/2016 21:38:44 - test - Entrou no sistema
95 06/09/2016 21:38:44 - test - Acessou home 95 06/09/2016 21:38:44 - test - Acessou home
  96 +06/09/2016 21:58:49 - jailson - Entrou no sistema
  97 +06/09/2016 21:58:49 - jailson - Acessou home
  98 +06/09/2016 21:59:05 - jailson - Acessou home
  99 +06/09/2016 21:59:35 - jailson - Acessou home
  100 +06/09/2016 21:59:42 - jailson - Acessou home
users/migrations/0011_auto_20160908_1108.py 0 → 100644
@@ -0,0 +1,22 @@ @@ -0,0 +1,22 @@
  1 +# -*- coding: utf-8 -*-
  2 +# Generated by Django 1.10 on 2016-09-08 14:08
  3 +from __future__ import unicode_literals
  4 +
  5 +import django.core.validators
  6 +from django.db import migrations, models
  7 +import re
  8 +
  9 +
  10 +class Migration(migrations.Migration):
  11 +
  12 + dependencies = [
  13 + ('users', '0010_auto_20160906_2332'),
  14 + ]
  15 +
  16 + operations = [
  17 + migrations.AlterField(
  18 + model_name='user',
  19 + name='username',
  20 + field=models.CharField(help_text='A short name that will be used to identify you in the platform and to access it', max_length=35, unique=True, validators=[django.core.validators.RegexValidator(re.compile(b'^[\\w.@+-]+$'), 'Type a valid username. This fields should only contain letters, numbers and the characteres: @/./+/-/_ .', b'invalid')], verbose_name='Login'),
  21 + ),
  22 + ]
users/migrations/0012_auto_20160908_1625.py 0 → 100644
@@ -0,0 +1,22 @@ @@ -0,0 +1,22 @@
  1 +# -*- coding: utf-8 -*-
  2 +# Generated by Django 1.10 on 2016-09-08 19:25
  3 +from __future__ import unicode_literals
  4 +
  5 +import django.core.validators
  6 +from django.db import migrations, models
  7 +import re
  8 +
  9 +
  10 +class Migration(migrations.Migration):
  11 +
  12 + dependencies = [
  13 + ('users', '0011_auto_20160908_1108'),
  14 + ]
  15 +
  16 + operations = [
  17 + migrations.AlterField(
  18 + model_name='user',
  19 + name='username',
  20 + field=models.CharField(help_text='A short name that will be used to identify you in the platform and to access it', max_length=35, unique=True, validators=[django.core.validators.RegexValidator(re.compile('^[\\w.@+-]+$', 32), 'Type a valid username. This fields should only contain letters, numbers and the characteres: @/./+/-/_ .', 'invalid')], verbose_name='Login'),
  21 + ),
  22 + ]
users/views.py
@@ -149,4 +149,3 @@ class UpdateUser(LoginRequiredMixin, generic.edit.UpdateView): @@ -149,4 +149,3 @@ class UpdateUser(LoginRequiredMixin, generic.edit.UpdateView):
149 messages.success(self.request, _('Profile edited successfully!')) 149 messages.success(self.request, _('Profile edited successfully!'))
150 150
151 return super(UpdateUser, self).form_valid(form) 151 return super(UpdateUser, self).form_valid(form)
152 -