Commit 44349888cef93376ca92718bcb62cf36d5b8d1d2

Authored by Matheus Lins
2 parents fad2dce2 b156bc27

merg

Showing 51 changed files with 404 additions and 1347 deletions   Show diff stats
app/migrations/__init__.py
@@ -18,8 +18,7 @@ class AppIndex(LoginRequiredMixin, LogMixin, ListView, NotificationMixin): @@ -18,8 +18,7 @@ class AppIndex(LoginRequiredMixin, LogMixin, ListView, NotificationMixin):
18 context_object_name = 'objects' 18 context_object_name = 'objects'
19 paginate_by = 10 19 paginate_by = 10
20 20
21 - not_action = "Acessar"  
22 - not_resource = "home" 21 +
23 22
24 def get_queryset(self): 23 def get_queryset(self):
25 if self.request.user.is_staff: 24 if self.request.user.is_staff:
@@ -43,7 +42,7 @@ class AppIndex(LoginRequiredMixin, LogMixin, ListView, NotificationMixin): @@ -43,7 +42,7 @@ class AppIndex(LoginRequiredMixin, LogMixin, ListView, NotificationMixin):
43 else: 42 else:
44 self.template_name = "home_teacher_student_content.html" 43 self.template_name = "home_teacher_student_content.html"
45 44
46 - 45 + #super(AppIndex, self).createNotification("testando notificacao de login", resource_name="home", resource_link="/")
47 return self.response_class(request = self.request, template = self.template_name, context = context, using = self.template_engine, **response_kwargs) 46 return self.response_class(request = self.request, template = self.template_name, context = context, using = self.template_engine, **response_kwargs)
48 47
49 48
core/context_processors.py
1 from .models import Notification 1 from .models import Notification
2 2
3 def notifications(request): 3 def notifications(request):
4 - if request.user.is_authenticated:  
5 - return {  
6 - 'notifications': Notification.objects.filter(user= request.user, read=False).order_by('-datetime')  
7 - }  
8 - else:  
9 - return request  
10 \ No newline at end of file 4 \ No newline at end of file
  5 + context = {}
  6 + context['notifications'] = None
  7 + if not request.user is None:
  8 + if request.user.is_authenticated:
  9 + return {
  10 + 'notifications': Notification.objects.filter(user= request.user, read=False).order_by('-datetime')
  11 + }
  12 + return context
core/decorators.py
@@ -47,41 +47,41 @@ def log_decorator(log_action = '', log_resource = ''): @@ -47,41 +47,41 @@ def log_decorator(log_action = '', log_resource = ''):
47 return _log_decorator 47 return _log_decorator
48 48
49 49
50 -def notification_decorator(read = False, message = '', actor = None, users = [], not_action='', not_resource=''): 50 +def notification_decorator(read = False, message = '', actor = None, users = [], not_action='', not_resource='', resource_link=''):
51 51
52 def _notification_decorator(view_function): 52 def _notification_decorator(view_function):
53 53
54 def _decorator(request, *args, **kwargs): 54 def _decorator(request, *args, **kwargs):
55 #Do something before the call 55 #Do something before the call
56 - 56 +
57 response = view_function(request, *args, **kwargs) 57 response = view_function(request, *args, **kwargs)
58 action = Action.objects.filter(name = not_action) 58 action = Action.objects.filter(name = not_action)
59 resource = Resource.objects.filter(name = not_resource) 59 resource = Resource.objects.filter(name = not_resource)
60 -  
61 - if not action: 60 + print(resource_link)
  61 + if action.exists():
  62 + action = action[0]
  63 + else:
62 action = Action(name = not_action) 64 action = Action(name = not_action)
63 action.save() 65 action.save()
64 - else:  
65 - action = action[0]  
66 66
67 - if not resource:  
68 - resource = Resource(name = not_resource)  
69 - resource.save()  
70 - else: 67 + if resource.exists():
71 resource = resource[0] 68 resource = resource[0]
  69 + else:
  70 + resource = Resource(name = not_resource, url= resource_link)
  71 + print(resource)
  72 + resource.save()
72 73
73 action_resource = Action_Resource.objects.filter(action = action, resource = resource) 74 action_resource = Action_Resource.objects.filter(action = action, resource = resource)
74 75
75 - if not action_resource: 76 + if action_resource.exists():
  77 + action_resource = action_resource[0]
  78 + else:
76 action_resource = Action_Resource(action = action, resource = resource) 79 action_resource = Action_Resource(action = action, resource = resource)
77 action_resource.save() 80 action_resource.save()
78 - else:  
79 - action_resource = action_resource[0]  
80 -  
81 - if request.user.is_authenticated: #the user was authenticated by the view  
82 - notification = Notification(actor = request.user, message= message,  
83 - action_resource = action_resource, user = request.user)  
84 81
  82 + for user in users:
  83 + notification = Notification(user=user, actor= actor, message=message, action_resource= action_resource)
  84 + notification.save()
85 85
86 86
87 #Do something after the call 87 #Do something after the call
core/migrations/0001_initial.py
1 # -*- coding: utf-8 -*- 1 # -*- coding: utf-8 -*-
2 -# Generated by Django 1.10 on 2016-09-06 17:50 2 +# Generated by Django 1.10 on 2016-09-20 13:57
3 from __future__ import unicode_literals 3 from __future__ import unicode_literals
4 4
  5 +import autoslug.fields
5 from django.conf import settings 6 from django.conf import settings
6 from django.db import migrations, models 7 from django.db import migrations, models
7 import django.db.models.deletion 8 import django.db.models.deletion
@@ -24,8 +25,8 @@ class Migration(migrations.Migration): @@ -24,8 +25,8 @@ class Migration(migrations.Migration):
24 ('created_date', models.DateField(auto_now_add=True, verbose_name='Created Date')), 25 ('created_date', models.DateField(auto_now_add=True, verbose_name='Created Date')),
25 ], 26 ],
26 options={ 27 options={
27 - 'verbose_name': 'Action',  
28 'verbose_name_plural': 'Actions', 28 'verbose_name_plural': 'Actions',
  29 + 'verbose_name': 'Action',
29 }, 30 },
30 ), 31 ),
31 migrations.CreateModel( 32 migrations.CreateModel(
@@ -35,22 +36,37 @@ class Migration(migrations.Migration): @@ -35,22 +36,37 @@ class Migration(migrations.Migration):
35 ('action', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='core.Action', verbose_name='Action_Applied')), 36 ('action', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='core.Action', verbose_name='Action_Applied')),
36 ], 37 ],
37 options={ 38 options={
38 - 'verbose_name': 'Action_Resource',  
39 'verbose_name_plural': 'Action_Resources', 39 'verbose_name_plural': 'Action_Resources',
  40 + 'verbose_name': 'Action_Resource',
  41 + },
  42 + ),
  43 + migrations.CreateModel(
  44 + name='Log',
  45 + fields=[
  46 + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
  47 + ('datetime', models.DateTimeField(auto_now_add=True, verbose_name='Date and Time of action')),
  48 + ('action_resource', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='core.Action_Resource', verbose_name='Action_Resource')),
  49 + ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='Actor')),
  50 + ],
  51 + options={
  52 + 'verbose_name_plural': 'Logs',
  53 + 'verbose_name': 'Log',
40 }, 54 },
41 ), 55 ),
42 migrations.CreateModel( 56 migrations.CreateModel(
43 name='Notification', 57 name='Notification',
44 fields=[ 58 fields=[
45 ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), 59 ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
46 - ('message', models.TextField(verbose_name='message')), 60 + ('message', models.TextField(verbose_name='Message')),
47 ('read', models.BooleanField(default=False, verbose_name='Read')), 61 ('read', models.BooleanField(default=False, verbose_name='Read')),
  62 + ('datetime', models.DateTimeField(auto_now_add=True, verbose_name='Date and Time of action')),
48 ('action_resource', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='core.Action_Resource', verbose_name='Action_Resource')), 63 ('action_resource', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='core.Action_Resource', verbose_name='Action_Resource')),
49 - ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='Actor')), 64 + ('actor', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='notification_Performer', to=settings.AUTH_USER_MODEL, verbose_name='Perfomer')),
  65 + ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='notification_Actor', to=settings.AUTH_USER_MODEL, verbose_name='User')),
50 ], 66 ],
51 options={ 67 options={
52 - 'verbose_name': 'Action_Resource',  
53 - 'verbose_name_plural': 'Action_Resources', 68 + 'verbose_name_plural': 'Notifications',
  69 + 'verbose_name': 'Notification',
54 }, 70 },
55 ), 71 ),
56 migrations.CreateModel( 72 migrations.CreateModel(
@@ -58,11 +74,13 @@ class Migration(migrations.Migration): @@ -58,11 +74,13 @@ class Migration(migrations.Migration):
58 fields=[ 74 fields=[
59 ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), 75 ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
60 ('name', models.CharField(max_length=100, verbose_name='Name')), 76 ('name', models.CharField(max_length=100, verbose_name='Name')),
  77 + ('slug', autoslug.fields.AutoSlugField(editable=False, null=True, populate_from='name', unique=True, verbose_name='Slug')),
61 ('created_date', models.DateField(auto_now_add=True, verbose_name='Created Date')), 78 ('created_date', models.DateField(auto_now_add=True, verbose_name='Created Date')),
  79 + ('url', models.CharField(default='', max_length=100, verbose_name='URL')),
62 ], 80 ],
63 options={ 81 options={
64 - 'verbose_name': 'Resource',  
65 'verbose_name_plural': 'Resources', 82 'verbose_name_plural': 'Resources',
  83 + 'verbose_name': 'Resource',
66 }, 84 },
67 ), 85 ),
68 migrations.AddField( 86 migrations.AddField(
core/migrations/0002_auto_20160907_0038.py
@@ -1,48 +0,0 @@ @@ -1,48 +0,0 @@
1 -# -*- coding: utf-8 -*-  
2 -# Generated by Django 1.9.7 on 2016-09-07 03:38  
3 -from __future__ import unicode_literals  
4 -  
5 -import datetime  
6 -from django.conf import settings  
7 -from django.db import migrations, models  
8 -import django.db.models.deletion  
9 -from django.utils.timezone import utc  
10 -  
11 -  
12 -class Migration(migrations.Migration):  
13 -  
14 - dependencies = [  
15 - migrations.swappable_dependency(settings.AUTH_USER_MODEL),  
16 - ('core', '0001_initial'),  
17 - ]  
18 -  
19 - operations = [  
20 - migrations.CreateModel(  
21 - name='Log',  
22 - fields=[  
23 - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),  
24 - ('datetime', models.DateTimeField(auto_now_add=True, verbose_name='Date and Time of action')),  
25 - ('action_resource', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='core.Action_Resource', verbose_name='Action_Resource')),  
26 - ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='Actor')),  
27 - ],  
28 - options={  
29 - 'verbose_name_plural': 'Logs',  
30 - 'verbose_name': 'Log',  
31 - },  
32 - ),  
33 - migrations.AlterModelOptions(  
34 - name='notification',  
35 - options={'verbose_name': 'Notification', 'verbose_name_plural': 'Notifications'},  
36 - ),  
37 - migrations.AddField(  
38 - model_name='notification',  
39 - name='datetime',  
40 - field=models.DateTimeField(auto_now_add=True, default=datetime.datetime(2016, 9, 7, 3, 38, 49, 367825, tzinfo=utc), verbose_name='Date and Time of action'),  
41 - preserve_default=False,  
42 - ),  
43 - migrations.AlterField(  
44 - model_name='notification',  
45 - name='message',  
46 - field=models.TextField(verbose_name='Message'),  
47 - ),  
48 - ]  
core/migrations/0003_auto_20160908_1108.py
@@ -1,28 +0,0 @@ @@ -1,28 +0,0 @@
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
@@ -1,20 +0,0 @@ @@ -1,20 +0,0 @@
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/migrations/0005_resource_link.py
@@ -1,20 +0,0 @@ @@ -1,20 +0,0 @@
1 -# -*- coding: utf-8 -*-  
2 -# Generated by Django 1.10 on 2016-09-12 14:36  
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', '0004_auto_20160908_1151'),  
12 - ]  
13 -  
14 - operations = [  
15 - migrations.AddField(  
16 - model_name='resource',  
17 - name='link',  
18 - field=models.CharField(default='', max_length=100, unique=True, verbose_name='URL'),  
19 - ),  
20 - ]  
core/migrations/0006_auto_20160912_1138.py
@@ -1,20 +0,0 @@ @@ -1,20 +0,0 @@
1 -# -*- coding: utf-8 -*-  
2 -# Generated by Django 1.10 on 2016-09-12 14:38  
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', '0005_resource_link'),  
12 - ]  
13 -  
14 - operations = [  
15 - migrations.AlterField(  
16 - model_name='resource',  
17 - name='link',  
18 - field=models.CharField(default='', max_length=100, verbose_name='URL'),  
19 - ),  
20 - ]  
core/migrations/0007_remove_resource_link.py
@@ -1,19 +0,0 @@ @@ -1,19 +0,0 @@
1 -# -*- coding: utf-8 -*-  
2 -# Generated by Django 1.10 on 2016-09-12 14:51  
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', '0006_auto_20160912_1138'),  
12 - ]  
13 -  
14 - operations = [  
15 - migrations.RemoveField(  
16 - model_name='resource',  
17 - name='link',  
18 - ),  
19 - ]  
core/migrations/0008_resource_link.py
@@ -1,20 +0,0 @@ @@ -1,20 +0,0 @@
1 -# -*- coding: utf-8 -*-  
2 -# Generated by Django 1.10 on 2016-09-12 14:52  
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', '0007_remove_resource_link'),  
12 - ]  
13 -  
14 - operations = [  
15 - migrations.AddField(  
16 - model_name='resource',  
17 - name='link',  
18 - field=models.CharField(default='', max_length=100, verbose_name='URL'),  
19 - ),  
20 - ]  
core/migrations/0009_auto_20160916_0126.py
@@ -1,20 +0,0 @@ @@ -1,20 +0,0 @@
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 - ]  
core/mixins.py
@@ -41,24 +41,23 @@ class LogMixin(object): @@ -41,24 +41,23 @@ class LogMixin(object):
41 class NotificationMixin(object): 41 class NotificationMixin(object):
42 message = "" 42 message = ""
43 read = False 43 read = False
44 - not_action = ''  
45 - not_resource = '' 44 + action_name = ''
  45 + resource_name = ''
46 46
47 - def createNotification(self, message='', actor=None, users = User.objects.all(), not_action = '', not_resource='', resource_link=''): #the default will be a broadcast  
48 - action = Action.objects.filter(name = self.not_action)  
49 - resource = Resource.objects.filter(name = not_resource)  
50 - print(resource_link) 47 + def createNotification(self, message='', actor=None, users = User.objects.all(), resource_slug='' ,action_name = '', resource_name='', resource_link=''): #the default will be a broadcast
  48 + action = Action.objects.filter(name = action_name)
  49 + resource = Resource.objects.filter(slug = resource_slug)
  50 + print(message)
51 if action.exists(): 51 if action.exists():
52 action = action[0] 52 action = action[0]
53 else: 53 else:
54 - action = Action(name = self.not_action) 54 + action = Action(name = self.action_name)
55 action.save() 55 action.save()
56 56
57 if resource.exists(): 57 if resource.exists():
58 resource = resource[0] 58 resource = resource[0]
59 else: 59 else:
60 - resource = Resource(name = self.not_resource, link= resource_link)  
61 - print(resource) 60 + resource = Resource(name = self.resource_name, url= resource_link)
62 resource.save() 61 resource.save()
63 62
64 action_resource = Action_Resource.objects.filter(action = action, resource = resource) 63 action_resource = Action_Resource.objects.filter(action = action, resource = resource)
@@ -77,4 +76,5 @@ class NotificationMixin(object): @@ -77,4 +76,5 @@ class NotificationMixin(object):
77 def dispatch(self, request, *args, **kwargs): 76 def dispatch(self, request, *args, **kwargs):
78 """ 77 """
79 Not quite sure how to do about it""" 78 Not quite sure how to do about it"""
  79 + print("testing IF IT REACHES HERE")
80 return super(NotificationMixin, self).dispatch(request, *args, **kwargs) 80 return super(NotificationMixin, self).dispatch(request, *args, **kwargs)
81 \ No newline at end of file 81 \ No newline at end of file
core/models.py
1 from django.db import models 1 from django.db import models
2 from django.utils.translation import ugettext_lazy as _ 2 from django.utils.translation import ugettext_lazy as _
3 from users.models import User 3 from users.models import User
  4 +from autoslug.fields import AutoSlugField
4 # Create your models here. 5 # Create your models here.
5 6
6 class Action(models.Model): 7 class Action(models.Model):
@@ -32,7 +33,8 @@ class Resource(models.Model): @@ -32,7 +33,8 @@ class Resource(models.Model):
32 @link: Which URL made that resource able to find 33 @link: Which URL made that resource able to find
33 """ 34 """
34 35
35 - name = models.CharField(_('Name'), max_length =100, unique=True) 36 + name = models.CharField(_('Name'), max_length =100)
  37 + slug = AutoSlugField(_("Slug"), populate_from='name', unique=True, null=True)
36 created_date = models.DateField(_('Created Date'), auto_now_add=True) 38 created_date = models.DateField(_('Created Date'), auto_now_add=True)
37 url = models.CharField(_('URL'), max_length =100, default="") 39 url = models.CharField(_('URL'), max_length =100, default="")
38 40
core/static/css/base/amadeus.css
  1 +/* HEADER */
  2 +#notificationscroll{
  3 + max-height: 500%;
  4 + overflow: auto;
  5 +}
  6 +
  7 +/* HEADER */
  8 +
  9 +
1 .logoLogin{ 10 .logoLogin{
2 padding-bottom: 1%; 11 padding-bottom: 1%;
3 width: 15%; 12 width: 15%;
core/templates/base.html
@@ -54,7 +54,7 @@ @@ -54,7 +54,7 @@
54 <ul class="nav navbar-nav navbar-right notifications"> 54 <ul class="nav navbar-nav navbar-right notifications">
55 <li class="" data-toggle="tooltip" data-placement="bottom" title data-original-title="notifications"> 55 <li class="" data-toggle="tooltip" data-placement="bottom" title data-original-title="notifications">
56 <a class="dropdown-toggle" data-toggle="dropdown"> <span class="badge notification-count">{{notifications.count}}</span><i class="fa fa-bell-o" aria-hidden="true"></i></a> 56 <a class="dropdown-toggle" data-toggle="dropdown"> <span class="badge notification-count">{{notifications.count}}</span><i class="fa fa-bell-o" aria-hidden="true"></i></a>
57 - <ul class="dropdown-menu"> 57 + <ul id="notification-dropdown" class="dropdown-menu">
58 <li class="dropdown-header">Notifications</li> 58 <li class="dropdown-header">Notifications</li>
59 {% for notification in notifications %} 59 {% for notification in notifications %}
60 {% if notification.actor %} <!-- if the notification has a user--> 60 {% if notification.actor %} <!-- if the notification has a user-->
core/templates/index.html
@@ -10,71 +10,86 @@ @@ -10,71 +10,86 @@
10 {% endblock sidebar %} 10 {% endblock sidebar %}
11 11
12 {% block content %} 12 {% block content %}
13 - <div class="row logo-row">  
14 - <div class="col-lg-offset-2 col-lg-9">  
15 - <img src="{% static 'img/amadeus.png' %}" class="img-responsive center-block " alt="logo amadeus" id="logo"> 13 + <div class="row">
  14 + <div class="col-md-4 col-md-offset-4">
  15 + <div class="row">
  16 + <div class="col-md-offset-2 col-md-8">
  17 + </br>
  18 + </br>
  19 + <img src="{% static 'img/amadeus.png' %}" class="img-responsive center-block " alt="logo amadeus">
  20 + </br>
  21 + </div>
  22 + </div>
16 </div> 23 </div>
17 -  
18 <div class="row"> 24 <div class="row">
19 {% for breadcrumb in breadcrumbs %} 25 {% for breadcrumb in breadcrumbs %}
20 <a href="{{ breadcrumb.url }}">{{ breadcrumb.text }}</a> 26 <a href="{{ breadcrumb.url }}">{{ breadcrumb.text }}</a>
21 {% endfor %} 27 {% endfor %}
22 - </div>  
23 -  
24 - <div class="row ">  
25 - <div class="col-md-8 col-md-offset-2 col-sm-6 col-sm-offset-3">  
26 - <div class="card">  
27 - {% if message %}  
28 - <div class="alert alert-danger fade in">  
29 - {{message}}  
30 - </div>  
31 -  
32 - {% endif %}  
33 - <div class="card-content">  
34 -  
35 - <form id="form-login" class="form-group" method="post" action="">  
36 - {% csrf_token %}  
37 - <div class="form-group is-empty">  
38 - <label for="inputEmail" class="col-md-4 control-label"> {% trans 'Username' %}</label>  
39 - <div class="col-md-8">  
40 - <input form="form-login" type="text" name="username" class="form-control" id="inputEmail" placeholder="Username">  
41 - </div>  
42 - </div>  
43 - <div class="form-group is-empty">  
44 - <label for="inputPassword" class="col-md-4 control-label"> {% trans 'Password' %}</label>  
45 - <div class="col-md-8">  
46 - <input form="form-login" type="password" name="password" class="form-control" id="inputPassword" placeholder="Password">  
47 - </div>  
48 - </div>  
49 - <div class=" col-md-10">  
50 - <div class="checkbox">  
51 - <label>  
52 - <input form="form-login" type="checkbox" name="checkbox"><span class="checkbox-material"><span class="check"></span></span> {% trans 'Remember Email' %}  
53 - </label>  
54 - </div>  
55 - </div>  
56 - </form>  
57 - 28 + </div>
58 29
59 -  
60 - <div class="col-md-6 col-xs-6">  
61 - <button type="button" class="btn btn-flat" formaction="#" style="position: initial;">{% trans 'Guest' %}</button> 30 + <div class="row ">
  31 + <div class="col-md-8 col-md-offset-2 col-sm-6 col-sm-offset-3">
  32 + {% if message %}
  33 + <div class="alert alert-danger alert-dismissible" role="alert">
  34 + <button type="button" class="close" data-dismiss="alert" aria-label="Close">
  35 + <span aria-hidden="true">&times;</span>
  36 + </button>
  37 + <ul>
  38 + <li>{{ message }}</li>
  39 + </ul>
  40 + </div>
  41 + {% endif %}
  42 + <div class="card">
  43 + <div class="card-block">
  44 + {# <div class="row"> #}
  45 + <form id="form-login" class="form-group" method="post" action="">
  46 + {% csrf_token %}
  47 + <div class="form-group is-empty">
  48 + <label for="inputEmail" class="col-md-4 control-label"> {% trans 'Username' %}</label>
  49 + <div class="col-md-8">
  50 + <input form="form-login" type="text" name="username" class="form-control" id="inputEmail" placeholder="Username" value="{% if username %}{{username}}{% endif %}">
62 </div> 51 </div>
63 - <div class="col-md-6 col-xs-6">  
64 - <button type="submite" class="btn btn-flat btn-success" form="form-login" style="position: initial;">{% trans 'Login' %}</button> 52 + </div>
  53 + <div class="form-group is-empty">
  54 + <label for="inputPassword" class="col-md-4 control-label"> {% trans 'Password' %}</label>
  55 + <div class="col-md-8">
  56 + <input form="form-login" type="password" name="password" class="form-control" id="inputPassword" placeholder="Password">
  57 + </div>
  58 + </div>
  59 + <div class="col-md-10">
  60 + <div class="checkbox">
  61 + <label>
  62 + <input form="form-login" type="checkbox" name="checkbox"><span class="checkbox-material"><span class="check"></span></span> {% trans 'Remember Email' %}
  63 + </label>
65 </div> 64 </div>
66 - 65 + </div>
  66 + </form>
  67 + {# </div> #}
  68 + {# <div class="row"> #}
  69 + <div class="col-md-10">
  70 + <a href="{% url 'core:remember_password' %}">Forgot your password?</a>
  71 + </div>
  72 + {# </div> #}
  73 + {# <div class="row"> #}
  74 + <div class="col-md-6 col-xs-6 text-center">
  75 + <button type="button" class="btn btn-flat" formaction="#" style="position: initial;">{% trans 'Guest' %}</button>
  76 + </div>
  77 + <div class="col-md-6 col-xs-6 text-center">
  78 + <button type="submite" class="btn btn-flat btn-success" form="form-login" style="position: initial;">{% trans 'Login' %}</button>
  79 + </div>
  80 + {# </div> #}
67 </div> 81 </div>
68 - </div>  
69 - </div> 82 + </div>
  83 + </div>
70 </div> 84 </div>
71 <div class="row"> 85 <div class="row">
72 - <div class="col-lg-offset-2 col-lg-8 col-md-8 col-md-offset-2 col-sm-6 col-sm-offset-3">  
73 - <a class="btn btn-raised btn-primary btn-lg btn-block" href="{% url 'core:register' %}">{% trans 'Sign Up' %} </a>  
74 - </div> 86 + <div class="col-lg-offset-2 col-lg-8 col-md-8 col-md-offset-2 col-sm-6 col-sm-offset-3">
  87 + <a class="btn btn-raised btn-primary btn-lg btn-block" href="{% url 'core:register' %}">{% trans 'Sign Up' %} </a>
  88 + </div>
75 </div> 89 </div>
  90 + </div>
76 {% endblock%} 91 {% endblock%}
77 92
78 {% block rightbar %} 93 {% block rightbar %}
79 -  
80 -{% endblock rightbar %}  
81 \ No newline at end of file 94 \ No newline at end of file
  95 +
  96 +{% endblock rightbar %}
core/templates/remember_password.html
1 {% extends "index.html" %} 1 {% extends "index.html" %}
2 -{% load i18n %}  
3 -{% block content %} 2 +{% load i18n static %}
  3 +{% block content%}
4 4
5 - <div class="row logo-row">  
6 - <div class="col-lg-offset-2 col-lg-9">  
7 - <img src="..." class="img-responsive center-block " alt="logo amadeus">  
8 - </div>  
9 - </div>  
10 - <div class="row ">  
11 - <div class="col-lg-9 col-lg-offset-2">  
12 - <div class="card">  
13 - {% if success %}  
14 - <div class="alert alert-success fade in">  
15 - {{success}}  
16 - </div>  
17 - {% elif danger %}  
18 - <div class="alert alert-danger fade in">  
19 - {{danger}}  
20 - </div>  
21 - {% endif %}  
22 - <div class="card-content">  
23 - <div class="card-body"> 5 + <div class="row">
  6 + <div class="col-md-4 col-md-offset-4">
  7 + <div class="row">
  8 + <div class="col-md-offset-2 col-md-8">
  9 + </br>
  10 + </br>
  11 + <img src="{% static 'img/amadeus.png' %}" class="img-responsive center-block " alt="logo amadeus">
  12 + </br>
  13 + </div>
  14 + </div>
  15 + </div>
  16 + <div class="row ">
  17 + <div class="col-lg-9 col-lg-offset-2">
  18 + {% if success %}
  19 + <div class="alert alert-success alert-dismissible" role="alert">
  20 + <button type="button" class="close" data-dismiss="alert" aria-label="Close">
  21 + <span aria-hidden="true">&times;</span>
  22 + </button>
  23 + <ul>
  24 + <li>{{ success }}</li>
  25 + </ul>
  26 + </div>
  27 + {% elif danger %}
  28 + <div class="alert alert-danger alert-dismissible" role="alert">
  29 + <button type="button" class="close" data-dismiss="alert" aria-label="Close">
  30 + <span aria-hidden="true">&times;</span>
  31 + </button>
  32 + <ul>
  33 + <li>{{ danger }}</li>
  34 + </ul>
  35 + </div>
  36 + {% endif %}
  37 + <div class="card">
  38 + <div class="card-block">
  39 + <div class="col-md-12">
24 <form class="form-group " method="post" action=""> 40 <form class="form-group " method="post" action="">
25 {% csrf_token %} 41 {% csrf_token %}
26 - <div class="form-group">  
27 - <label for="inputEmail" class="control-label label-static"> {% trans 'E-mail' %}</label>  
28 - <input name="email" type="email" class="form-control" id="inputEmail" placeholder="Email" {% if email %}value="{{email}}"{% endif %}> 42 + <div class="form-group is-empty">
  43 + <label for="inputEmail" class="ccontrol-label"> {% trans 'E-mail' %}</label>
  44 + {# <div class="col-md-8"> #}
  45 + <input name="email" type="email" class="form-control" id="inputEmail" placeholder="Email" {% if email %}value="{{email}}"{% endif %}>
  46 + {# </div> #}
29 </div> 47 </div>
30 - <div class="form-group">  
31 - <label for="inputRegistration" class=" control-label"> {% trans 'Registration' %} </label>  
32 - <input name="registration" type="text" class="form-control" id="inputRegistration" placeholder="Registration" {% if registration %}value="{{registration}}"{% endif %}> 48 + <div class="form-group is-empty">
  49 + <label for="inputRegistration" class="control-label"> {% trans 'Registration' %} </label>
  50 + {# <div class="col-md-8"> #}
  51 + <input name="registration" type="text" class="col-md-4 form-control" id="inputRegistration" placeholder="Registration" {% if registration %}value="{{registration}}"{% endif %}>
  52 + {# </div> #}
33 </div> 53 </div>
34 - <div class="col-lg-offset-4 col-lg-4">  
35 - <button type="submite" class="btn btn-raised btn-primary btn-lg btn-block">{% trans 'Send' %}</button>  
36 -  
37 - </div> 54 + <div class="col-lg-offset-4 col-lg-4">
  55 + <button type="submite" class="btn btn-raised btn-primary btn-lg btn-block">{% trans 'Send' %}</button>
38 56
  57 + </div>
39 </form> 58 </form>
40 </div> 59 </div>
41 -  
42 - </div>  
43 -  
44 - 60 + </div>
  61 + </div>
  62 + </div>
45 </div> 63 </div>
46 </div> 64 </div>
47 - </div>  
48 65
49 {% endblock content %} 66 {% endblock content %}
@@ -71,7 +71,7 @@ def remember_password(request): @@ -71,7 +71,7 @@ def remember_password(request):
71 @log_decorator('Acessar', 'Sistema') 71 @log_decorator('Acessar', 'Sistema')
72 def login(request): 72 def login(request):
73 context = {} 73 context = {}
74 - 74 +
75 if request.POST: 75 if request.POST:
76 username = request.POST['username'] 76 username = request.POST['username']
77 password = request.POST['password'] 77 password = request.POST['password']
@@ -81,9 +81,10 @@ def login(request): @@ -81,9 +81,10 @@ def login(request):
81 return redirect(reverse("app:index")) 81 return redirect(reverse("app:index"))
82 else: 82 else:
83 context["message"] = _("E-mail or password are incorrect!") 83 context["message"] = _("E-mail or password are incorrect!")
  84 + context["username"] = username
84 elif request.user.is_authenticated: 85 elif request.user.is_authenticated:
85 return redirect(reverse('app:index')) 86 return redirect(reverse('app:index'))
86 - 87 +
87 return render(request,"index.html",context) 88 return render(request,"index.html",context)
88 89
89 90
@@ -92,8 +93,7 @@ def processNotification(self, notificationId): @@ -92,8 +93,7 @@ def processNotification(self, notificationId):
92 notification = Notification.objects.get(id= notificationId) 93 notification = Notification.objects.get(id= notificationId)
93 notification.read = True 94 notification.read = True
94 notification.save() 95 notification.save()
95 -  
96 - return redirect(notification.action_resource.resource.link) 96 + return redirect(notification.action_resource.resource.url)
97 97
98 # class LoginClass(LoginView): 98 # class LoginClass(LoginView):
99 # template_name='index.html' 99 # template_name='index.html'
courses/context_processors.py
1 from .models import Course 1 from .models import Course
2 2
3 def courses(request): 3 def courses(request):
4 - if request.user.is_authenticated:  
5 - context = {}  
6 -  
7 - if request.user.is_staff:  
8 - context['courses_list'] = Course.objects.all()  
9 - else:  
10 - context['courses_list'] = Course.objects.filter(professors__in = [request.user])  
11 -  
12 - return context  
13 - else:  
14 - return request  
15 \ No newline at end of file 4 \ No newline at end of file
  5 + context = {}
  6 + context['courses_list'] = None
  7 + if not request.user is None:
  8 + if request.user.is_authenticated:
  9 + if request.user.is_staff:
  10 + context['courses_list'] = Course.objects.all()
  11 + else:
  12 + context['courses_list'] = Course.objects.filter(professors__in = [request.user])
  13 + return context
  14 + return context
courses/migrations/0001_initial.py
1 -# -*- coding: utf-8 -*-  
2 -# Generated by Django 1.9.7 on 2016-07-18 22:41  
3 -from __future__ import unicode_literals  
4 -  
5 -from django.db import migrations, models  
6 -import django.db.models.deletion  
7 -  
8 -  
9 -class Migration(migrations.Migration):  
10 -  
11 - initial = True  
12 -  
13 - dependencies = [  
14 - ]  
15 -  
16 - operations = [  
17 - migrations.CreateModel(  
18 - name='Course',  
19 - fields=[  
20 - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),  
21 - ('name', models.CharField(max_length=100, verbose_name='Nome')),  
22 - ('slug', models.SlugField(max_length=100, verbose_name='Identificador')),  
23 - ('objectivies', models.TextField(blank=True, verbose_name='Objetivos')),  
24 - ('content', models.TextField(blank=True, verbose_name='Conteúdo')),  
25 - ('max_students', models.PositiveIntegerField(blank=True, verbose_name='Máximo de Alunos')),  
26 - ('create_date', models.DateField(auto_now_add=True, verbose_name='Criação')),  
27 - ('init_register_date', models.DateField(verbose_name='Data de Cadastro (Início)')),  
28 - ('end_register_date', models.DateField(verbose_name='Data de Cadastro (Final)')),  
29 - ('init_date', models.DateField(verbose_name='Data de Início do Curso')),  
30 - ('end_date', models.DateField(verbose_name='Data de Final do Curso')),  
31 - ('image', models.ImageField(blank=True, upload_to='', verbose_name='Imagem')),  
32 - ],  
33 - options={  
34 - 'verbose_name_plural': 'Cursos',  
35 - 'verbose_name': 'Curso',  
36 - },  
37 - ),  
38 - migrations.CreateModel(  
39 - name='Module',  
40 - fields=[  
41 - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),  
42 - ('name', models.CharField(max_length=100, verbose_name='Nome')),  
43 - ('slug', models.SlugField(max_length=100, verbose_name='Identificador')),  
44 - ('description', models.TextField(blank=True, verbose_name='Descrição')),  
45 - ('visible', models.BooleanField(default=True, verbose_name='Visível')),  
46 - ('course', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='courses.Course', verbose_name='Curso')),  
47 - ],  
48 - options={  
49 - 'verbose_name_plural': 'Módulos',  
50 - 'verbose_name': 'Módulo',  
51 - },  
52 - ),  
53 - ] 1 +# -*- coding: utf-8 -*-
  2 +# Generated by Django 1.10 on 2016-09-20 13:57
  3 +from __future__ import unicode_literals
  4 +
  5 +import autoslug.fields
  6 +from django.conf import settings
  7 +from django.db import migrations, models
  8 +import django.db.models.deletion
  9 +
  10 +
  11 +class Migration(migrations.Migration):
  12 +
  13 + initial = True
  14 +
  15 + dependencies = [
  16 + ('core', '0001_initial'),
  17 + migrations.swappable_dependency(settings.AUTH_USER_MODEL),
  18 + ]
  19 +
  20 + operations = [
  21 + migrations.CreateModel(
  22 + name='Activity',
  23 + fields=[
  24 + ('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')),
  25 + ('create_date', models.DateTimeField(auto_now_add=True, verbose_name='Creation Date')),
  26 + ('limit_date', models.DateTimeField(verbose_name='Deliver Date')),
  27 + ('student', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='student')),
  28 + ],
  29 + bases=('core.resource',),
  30 + ),
  31 + migrations.CreateModel(
  32 + name='Category',
  33 + fields=[
  34 + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
  35 + ('name', models.CharField(max_length=100, unique=True, verbose_name='Name')),
  36 + ('slug', autoslug.fields.AutoSlugField(editable=False, populate_from='name', unique=True, verbose_name='Slug')),
  37 + ('create_date', models.DateField(auto_now_add=True, verbose_name='Creation Date')),
  38 + ],
  39 + options={
  40 + 'verbose_name': 'Category',
  41 + 'verbose_name_plural': 'Categories',
  42 + },
  43 + ),
  44 + migrations.CreateModel(
  45 + name='Course',
  46 + fields=[
  47 + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
  48 + ('name', models.CharField(max_length=100, verbose_name='Name')),
  49 + ('slug', autoslug.fields.AutoSlugField(editable=False, populate_from='name', unique=True, verbose_name='Slug')),
  50 + ('objectivies', models.TextField(blank=True, verbose_name='Objectivies')),
  51 + ('content', models.TextField(blank=True, verbose_name='Content')),
  52 + ('max_students', models.PositiveIntegerField(blank=True, verbose_name='Maximum Students')),
  53 + ('create_date', models.DateField(auto_now_add=True, verbose_name='Creation Date')),
  54 + ('init_register_date', models.DateField(verbose_name='Register Date (Begin)')),
  55 + ('end_register_date', models.DateField(verbose_name='Register Date (End)')),
  56 + ('init_date', models.DateField(verbose_name='Begin of Course Date')),
  57 + ('end_date', models.DateField(verbose_name='End of Course Date')),
  58 + ('image', models.ImageField(blank=True, upload_to='courses/', verbose_name='Image')),
  59 + ('category', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='courses.Category', verbose_name='Category')),
  60 + ('professors', models.ManyToManyField(related_name='courses', to=settings.AUTH_USER_MODEL, verbose_name='Professors')),
  61 + ('students', models.ManyToManyField(related_name='courses_student', to=settings.AUTH_USER_MODEL, verbose_name='Students')),
  62 + ],
  63 + options={
  64 + 'verbose_name': 'Course',
  65 + 'verbose_name_plural': 'Courses',
  66 + 'ordering': ('create_date', 'name'),
  67 + },
  68 + ),
  69 + migrations.CreateModel(
  70 + name='Material',
  71 + fields=[
  72 + ('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')),
  73 + ('create_date', models.DateTimeField(auto_now_add=True, verbose_name='Creation Date')),
  74 + ('student', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='student')),
  75 + ],
  76 + bases=('core.resource',),
  77 + ),
  78 + migrations.CreateModel(
  79 + name='Subject',
  80 + fields=[
  81 + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
  82 + ('name', models.CharField(max_length=100, verbose_name='Name')),
  83 + ('slug', autoslug.fields.AutoSlugField(editable=False, populate_from='name', unique=True, verbose_name='Slug')),
  84 + ('description', models.TextField(blank=True, verbose_name='Description')),
  85 + ('visible', models.BooleanField(default=False, verbose_name='Visible')),
  86 + ('init_date', models.DateField(verbose_name='Begin of Subject Date')),
  87 + ('end_date', models.DateField(verbose_name='End of Subject Date')),
  88 + ('create_date', models.DateTimeField(auto_now_add=True, verbose_name='Creation Date')),
  89 + ('update_date', models.DateTimeField(auto_now=True, verbose_name='Date of last update')),
  90 + ('course', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='subjects', to='courses.Course', verbose_name='Course')),
  91 + ('professors', models.ManyToManyField(related_name='subjects', to=settings.AUTH_USER_MODEL, verbose_name='Professors')),
  92 + ],
  93 + options={
  94 + 'verbose_name': 'Subject',
  95 + 'verbose_name_plural': 'Subjects',
  96 + 'ordering': ('create_date', 'name'),
  97 + },
  98 + ),
  99 + migrations.CreateModel(
  100 + name='Topic',
  101 + fields=[
  102 + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
  103 + ('name', models.CharField(max_length=100, verbose_name='Name')),
  104 + ('slug', autoslug.fields.AutoSlugField(editable=False, populate_from='name', unique=True, verbose_name='Slug')),
  105 + ('description', models.TextField(blank=True, verbose_name='Description')),
  106 + ('create_date', models.DateTimeField(auto_now_add=True, verbose_name='Creation Date')),
  107 + ('update_date', models.DateTimeField(auto_now=True, verbose_name='Date of last update')),
  108 + ('visible', models.BooleanField(default=False, verbose_name='Visible')),
  109 + ('owner', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='Owner')),
  110 + ('subject', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='courses.Subject', verbose_name='Subject')),
  111 + ],
  112 + options={
  113 + 'verbose_name': 'Topic',
  114 + 'verbose_name_plural': 'Topics',
  115 + 'ordering': ('create_date', 'name'),
  116 + },
  117 + ),
  118 + migrations.AddField(
  119 + model_name='material',
  120 + name='topic',
  121 + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='courses.Topic', verbose_name='Topic'),
  122 + ),
  123 + migrations.AddField(
  124 + model_name='activity',
  125 + name='topic',
  126 + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='courses.Topic', verbose_name='Topic'),
  127 + ),
  128 + ]
courses/migrations/0002_auto_20160720_1837.py
@@ -1,47 +0,0 @@ @@ -1,47 +0,0 @@
1 -# -*- coding: utf-8 -*-  
2 -# Generated by Django 1.9.7 on 2016-07-20 21:37  
3 -from __future__ import unicode_literals  
4 -  
5 -import datetime  
6 -from django.db import migrations, models  
7 -import django.db.models.deletion  
8 -from django.utils.timezone import utc  
9 -  
10 -  
11 -class Migration(migrations.Migration):  
12 -  
13 - dependencies = [  
14 - ('courses', '0001_initial'),  
15 - ]  
16 -  
17 - operations = [  
18 - migrations.CreateModel(  
19 - name='Category',  
20 - fields=[  
21 - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),  
22 - ('name', models.CharField(max_length=100, verbose_name='Nome')),  
23 - ('slug', models.SlugField(max_length=100, verbose_name='Identificador')),  
24 - ('create_date', models.DateField(auto_now_add=True, verbose_name='Criação')),  
25 - ],  
26 - options={  
27 - 'verbose_name': 'Categoria',  
28 - 'verbose_name_plural': 'Categorias',  
29 - },  
30 - ),  
31 - migrations.AddField(  
32 - model_name='module',  
33 - name='create_date',  
34 - field=models.DateField(auto_now_add=True, default=datetime.datetime(2016, 7, 20, 21, 37, 26, 975666, tzinfo=utc), verbose_name='Criação'),  
35 - preserve_default=False,  
36 - ),  
37 - migrations.AlterField(  
38 - model_name='course',  
39 - name='image',  
40 - field=models.ImageField(blank=True, default='uploads/no_image.jpg', upload_to='uploads/', verbose_name='Imagem'),  
41 - ),  
42 - migrations.AddField(  
43 - model_name='course',  
44 - name='category',  
45 - field=models.ForeignKey(default=1, on_delete=django.db.models.deletion.CASCADE, to='courses.Category', verbose_name='Categoria'),  
46 - ),  
47 - ]  
courses/migrations/0003_auto_20160722_1735.py
@@ -1,25 +0,0 @@ @@ -1,25 +0,0 @@
1 -# -*- coding: utf-8 -*-  
2 -# Generated by Django 1.9.7 on 2016-07-22 20:35  
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 - ('courses', '0002_auto_20160720_1837'),  
12 - ]  
13 -  
14 - operations = [  
15 - migrations.AlterField(  
16 - model_name='category',  
17 - name='name',  
18 - field=models.CharField(max_length=100, unique=True, verbose_name='Nome'),  
19 - ),  
20 - migrations.AlterField(  
21 - model_name='course',  
22 - name='name',  
23 - field=models.CharField(max_length=100, unique=True, verbose_name='Nome'),  
24 - ),  
25 - ]  
courses/migrations/0004_auto_20160728_1625.py
@@ -1,20 +0,0 @@ @@ -1,20 +0,0 @@
1 -# -*- coding: utf-8 -*-  
2 -# Generated by Django 1.9.7 on 2016-07-28 19:25  
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 - ('courses', '0003_auto_20160722_1735'),  
12 - ]  
13 -  
14 - operations = [  
15 - migrations.AlterField(  
16 - model_name='course',  
17 - name='image',  
18 - field=models.ImageField(blank=True, default='no_image.jpg', upload_to='courses/', verbose_name='Imagem'),  
19 - ),  
20 - ]  
courses/migrations/0005_auto_20160815_0922.py
@@ -1,140 +0,0 @@ @@ -1,140 +0,0 @@
1 -# -*- coding: utf-8 -*-  
2 -# Generated by Django 1.9.7 on 2016-08-15 12:22  
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', '0004_auto_20160728_1625'),  
15 - ]  
16 -  
17 - operations = [  
18 - migrations.AlterModelOptions(  
19 - name='category',  
20 - options={'verbose_name': 'Category', 'verbose_name_plural': 'Categories'},  
21 - ),  
22 - migrations.AlterModelOptions(  
23 - name='course',  
24 - options={'verbose_name': 'Course', 'verbose_name_plural': 'Courses'},  
25 - ),  
26 - migrations.AlterModelOptions(  
27 - name='module',  
28 - options={'verbose_name': 'Module', 'verbose_name_plural': 'Modules'},  
29 - ),  
30 - migrations.AddField(  
31 - model_name='course',  
32 - name='user',  
33 - field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='User'),  
34 - ),  
35 - migrations.AlterField(  
36 - model_name='category',  
37 - name='create_date',  
38 - field=models.DateField(auto_now_add=True, verbose_name='Creation Date'),  
39 - ),  
40 - migrations.AlterField(  
41 - model_name='category',  
42 - name='name',  
43 - field=models.CharField(max_length=100, unique=True, verbose_name='Name'),  
44 - ),  
45 - migrations.AlterField(  
46 - model_name='category',  
47 - name='slug',  
48 - field=models.SlugField(max_length=100, verbose_name='Slug'),  
49 - ),  
50 - migrations.AlterField(  
51 - model_name='course',  
52 - name='category',  
53 - field=models.ForeignKey(default=1, on_delete=django.db.models.deletion.CASCADE, to='courses.Category', verbose_name='Category'),  
54 - ),  
55 - migrations.AlterField(  
56 - model_name='course',  
57 - name='content',  
58 - field=models.TextField(blank=True, verbose_name='Content'),  
59 - ),  
60 - migrations.AlterField(  
61 - model_name='course',  
62 - name='create_date',  
63 - field=models.DateField(auto_now_add=True, verbose_name='Creation Date'),  
64 - ),  
65 - migrations.AlterField(  
66 - model_name='course',  
67 - name='end_date',  
68 - field=models.DateField(verbose_name='End of Course Date'),  
69 - ),  
70 - migrations.AlterField(  
71 - model_name='course',  
72 - name='end_register_date',  
73 - field=models.DateField(verbose_name='Register Date (End)'),  
74 - ),  
75 - migrations.AlterField(  
76 - model_name='course',  
77 - name='image',  
78 - field=models.ImageField(blank=True, default='no_image.jpg', upload_to='courses/', verbose_name='Image'),  
79 - ),  
80 - migrations.AlterField(  
81 - model_name='course',  
82 - name='init_date',  
83 - field=models.DateField(verbose_name='Begin of Course Date'),  
84 - ),  
85 - migrations.AlterField(  
86 - model_name='course',  
87 - name='init_register_date',  
88 - field=models.DateField(verbose_name='Register Date (Begin)'),  
89 - ),  
90 - migrations.AlterField(  
91 - model_name='course',  
92 - name='max_students',  
93 - field=models.PositiveIntegerField(blank=True, verbose_name='Maximum Students'),  
94 - ),  
95 - migrations.AlterField(  
96 - model_name='course',  
97 - name='name',  
98 - field=models.CharField(max_length=100, unique=True, verbose_name='Name'),  
99 - ),  
100 - migrations.AlterField(  
101 - model_name='course',  
102 - name='objectivies',  
103 - field=models.TextField(blank=True, verbose_name='Objectivies'),  
104 - ),  
105 - migrations.AlterField(  
106 - model_name='course',  
107 - name='slug',  
108 - field=models.SlugField(max_length=100, verbose_name='Slug'),  
109 - ),  
110 - migrations.AlterField(  
111 - model_name='module',  
112 - name='course',  
113 - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='courses.Course', verbose_name='Course'),  
114 - ),  
115 - migrations.AlterField(  
116 - model_name='module',  
117 - name='create_date',  
118 - field=models.DateField(auto_now_add=True, verbose_name='Creation Date'),  
119 - ),  
120 - migrations.AlterField(  
121 - model_name='module',  
122 - name='description',  
123 - field=models.TextField(blank=True, verbose_name='Description'),  
124 - ),  
125 - migrations.AlterField(  
126 - model_name='module',  
127 - name='name',  
128 - field=models.CharField(max_length=100, verbose_name='Name'),  
129 - ),  
130 - migrations.AlterField(  
131 - model_name='module',  
132 - name='slug',  
133 - field=models.SlugField(max_length=100, verbose_name='Slug'),  
134 - ),  
135 - migrations.AlterField(  
136 - model_name='module',  
137 - name='visible',  
138 - field=models.BooleanField(default=True, verbose_name='Visible'),  
139 - ),  
140 - ]  
courses/migrations/0006_auto_20160907_2259.py
@@ -1,41 +0,0 @@ @@ -1,41 +0,0 @@
1 -# -*- coding: utf-8 -*-  
2 -# Generated by Django 1.10 on 2016-09-08 01:59  
3 -from __future__ import unicode_literals  
4 -  
5 -import autoslug.fields  
6 -from django.db import migrations, models  
7 -import django.db.models.deletion  
8 -  
9 -  
10 -class Migration(migrations.Migration):  
11 -  
12 - dependencies = [  
13 - ('courses', '0005_auto_20160815_0922'),  
14 - ]  
15 -  
16 - operations = [  
17 - migrations.CreateModel(  
18 - name='Subject',  
19 - fields=[  
20 - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),  
21 - ('name', models.CharField(max_length=100, verbose_name='Name')),  
22 - ('slug', autoslug.fields.AutoSlugField(editable=False, populate_from='name', unique=True, verbose_name='Slug')),  
23 - ('description', models.TextField(blank=True, verbose_name='Description')),  
24 - ('visible', models.BooleanField(default=True, verbose_name='Visible')),  
25 - ('create_date', models.DateTimeField(auto_now_add=True, verbose_name='Creation Date')),  
26 - ('update_date', models.DateTimeField(auto_now=True, verbose_name='Date of last update')),  
27 - ('course', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='subjects', to='courses.Course', verbose_name='Course')),  
28 - ],  
29 - options={  
30 - 'verbose_name': 'Subject',  
31 - 'verbose_name_plural': 'Subjects',  
32 - },  
33 - ),  
34 - migrations.RemoveField(  
35 - model_name='module',  
36 - name='course',  
37 - ),  
38 - migrations.DeleteModel(  
39 - name='Module',  
40 - ),  
41 - ]  
courses/migrations/0007_topic.py
@@ -1,33 +0,0 @@ @@ -1,33 +0,0 @@
1 -# -*- coding: utf-8 -*-  
2 -# Generated by Django 1.10 on 2016-09-08 02:51  
3 -from __future__ import unicode_literals  
4 -  
5 -import autoslug.fields  
6 -from django.db import migrations, models  
7 -import django.db.models.deletion  
8 -  
9 -  
10 -class Migration(migrations.Migration):  
11 -  
12 - dependencies = [  
13 - ('courses', '0006_auto_20160907_2259'),  
14 - ]  
15 -  
16 - operations = [  
17 - migrations.CreateModel(  
18 - name='Topic',  
19 - fields=[  
20 - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),  
21 - ('name', models.CharField(max_length=100, verbose_name='Name')),  
22 - ('slug', autoslug.fields.AutoSlugField(editable=False, populate_from='name', unique=True, verbose_name='Slug')),  
23 - ('description', models.TextField(blank=True, verbose_name='Description')),  
24 - ('create_date', models.DateTimeField(auto_now_add=True, verbose_name='Creation Date')),  
25 - ('update_date', models.DateTimeField(auto_now=True, verbose_name='Date of last update')),  
26 - ('subject', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='topics', to='courses.Subject', verbose_name='Subject')),  
27 - ],  
28 - options={  
29 - 'verbose_name': 'Topic',  
30 - 'verbose_name_plural': 'Topics',  
31 - },  
32 - ),  
33 - ]  
courses/migrations/0008_auto_20160908_1332.py
@@ -1,28 +0,0 @@ @@ -1,28 +0,0 @@
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
@@ -1,23 +0,0 @@ @@ -1,23 +0,0 @@
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/migrations/0010_auto_20160914_2119.py
@@ -1,42 +0,0 @@ @@ -1,42 +0,0 @@
1 -# -*- coding: utf-8 -*-  
2 -# Generated by Django 1.10 on 2016-09-15 00:19  
3 -from __future__ import unicode_literals  
4 -  
5 -import autoslug.fields  
6 -from django.conf import settings  
7 -from django.db import migrations, models  
8 -  
9 -  
10 -class Migration(migrations.Migration):  
11 -  
12 - dependencies = [  
13 - migrations.swappable_dependency(settings.AUTH_USER_MODEL),  
14 - ('courses', '0009_auto_20160908_1625'),  
15 - ]  
16 -  
17 - operations = [  
18 - migrations.RemoveField(  
19 - model_name='course',  
20 - name='user',  
21 - ),  
22 - migrations.AddField(  
23 - model_name='course',  
24 - name='professors',  
25 - field=models.ManyToManyField(related_name='courses', to=settings.AUTH_USER_MODEL, verbose_name='Professors'),  
26 - ),  
27 - migrations.AlterField(  
28 - model_name='category',  
29 - name='slug',  
30 - field=autoslug.fields.AutoSlugField(editable=False, populate_from='name', unique=True, verbose_name='Slug'),  
31 - ),  
32 - migrations.AlterField(  
33 - model_name='course',  
34 - name='name',  
35 - field=models.CharField(max_length=100, verbose_name='Name'),  
36 - ),  
37 - migrations.AlterField(  
38 - model_name='course',  
39 - name='slug',  
40 - field=autoslug.fields.AutoSlugField(editable=False, populate_from='name', unique=True, verbose_name='Slug'),  
41 - ),  
42 - ]  
courses/migrations/0011_auto_20160914_2126.py
@@ -1,49 +0,0 @@ @@ -1,49 +0,0 @@
1 -# -*- coding: utf-8 -*-  
2 -# Generated by Django 1.10 on 2016-09-15 00: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 - ('courses', '0010_auto_20160914_2119'),  
14 - ]  
15 -  
16 - operations = [  
17 - migrations.AlterModelOptions(  
18 - name='course',  
19 - options={'ordering': ('create_date', 'name'), 'verbose_name': 'Course', 'verbose_name_plural': 'Courses'},  
20 - ),  
21 - migrations.AlterModelOptions(  
22 - name='subject',  
23 - options={'ordering': ('create_date', 'name'), 'verbose_name': 'Subject', 'verbose_name_plural': 'Subjects'},  
24 - ),  
25 - migrations.AlterModelOptions(  
26 - name='topic',  
27 - options={'ordering': ('create_date', 'name'), 'verbose_name': 'Topic', 'verbose_name_plural': 'Topics'},  
28 - ),  
29 - migrations.AlterField(  
30 - model_name='course',  
31 - name='category',  
32 - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='courses.Category', verbose_name='Category'),  
33 - ),  
34 - migrations.AlterField(  
35 - model_name='course',  
36 - name='image',  
37 - field=models.ImageField(blank=True, upload_to='courses/', verbose_name='Image'),  
38 - ),  
39 - migrations.AlterField(  
40 - model_name='subject',  
41 - name='visible',  
42 - field=models.BooleanField(default=False, verbose_name='Visible'),  
43 - ),  
44 - migrations.AlterField(  
45 - model_name='topic',  
46 - name='owner',  
47 - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='topics', to=settings.AUTH_USER_MODEL, verbose_name='Owner'),  
48 - ),  
49 - ]  
courses/migrations/0012_course_students.py
@@ -1,22 +0,0 @@ @@ -1,22 +0,0 @@
1 -# -*- coding: utf-8 -*-  
2 -# Generated by Django 1.10 on 2016-09-15 02:57  
3 -from __future__ import unicode_literals  
4 -  
5 -from django.conf import settings  
6 -from django.db import migrations, models  
7 -  
8 -  
9 -class Migration(migrations.Migration):  
10 -  
11 - dependencies = [  
12 - migrations.swappable_dependency(settings.AUTH_USER_MODEL),  
13 - ('courses', '0011_auto_20160914_2126'),  
14 - ]  
15 -  
16 - operations = [  
17 - migrations.AddField(  
18 - model_name='course',  
19 - name='students',  
20 - field=models.ManyToManyField(related_name='courses_student', to=settings.AUTH_USER_MODEL, verbose_name='Students'),  
21 - ),  
22 - ]  
courses/migrations/0013_auto_20160916_0001.py
@@ -1,28 +0,0 @@ @@ -1,28 +0,0 @@
1 -# -*- coding: utf-8 -*-  
2 -# Generated by Django 1.10 on 2016-09-16 03:01  
3 -from __future__ import unicode_literals  
4 -  
5 -from django.db import migrations, models  
6 -import django.utils.timezone  
7 -  
8 -  
9 -class Migration(migrations.Migration):  
10 -  
11 - dependencies = [  
12 - ('courses', '0012_course_students'),  
13 - ]  
14 -  
15 - operations = [  
16 - migrations.AddField(  
17 - model_name='subject',  
18 - name='end_date',  
19 - field=models.DateField(default=django.utils.timezone.now, verbose_name='End of Subject Date'),  
20 - preserve_default=False,  
21 - ),  
22 - migrations.AddField(  
23 - model_name='subject',  
24 - name='init_date',  
25 - field=models.DateField(default=django.utils.timezone.now, verbose_name='Begin of Subject Date'),  
26 - preserve_default=False,  
27 - ),  
28 - ]  
courses/migrations/0013_auto_20160916_0126.py
@@ -1,48 +0,0 @@ @@ -1,48 +0,0 @@
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/migrations/0014_merge_20160916_0255.py
@@ -1,16 +0,0 @@ @@ -1,16 +0,0 @@
1 -# -*- coding: utf-8 -*-  
2 -# Generated by Django 1.10 on 2016-09-16 05:55  
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', '0013_auto_20160916_0001'),  
12 - ('courses', '0013_auto_20160916_0126'),  
13 - ]  
14 -  
15 - operations = [  
16 - ]  
courses/models.py
@@ -71,8 +71,8 @@ class Topic(models.Model): @@ -71,8 +71,8 @@ class Topic(models.Model):
71 description = models.TextField(_('Description'), blank = True) 71 description = models.TextField(_('Description'), blank = True)
72 create_date = models.DateTimeField(_('Creation Date'), auto_now_add = True) 72 create_date = models.DateTimeField(_('Creation Date'), auto_now_add = True)
73 update_date = models.DateTimeField(_('Date of last update'), auto_now=True) 73 update_date = models.DateTimeField(_('Date of last update'), auto_now=True)
74 - subject = models.ForeignKey(Subject, verbose_name = _('Subject'), related_name="topics")  
75 - owner = models.ForeignKey(User, verbose_name = _('Owner'), related_name="topics") 74 + subject = models.ForeignKey(Subject, verbose_name = _('Subject'))
  75 + owner = models.ForeignKey(User, verbose_name = _('Owner'))
76 visible = models.BooleanField(_('Visible'), default=False) 76 visible = models.BooleanField(_('Visible'), default=False)
77 77
78 class Meta: 78 class Meta:
@@ -89,14 +89,17 @@ Activity is something that has a deadline and has to be delivered by the student @@ -89,14 +89,17 @@ Activity is something that has a deadline and has to be delivered by the student
89 """ 89 """
90 class Activity(Resource): 90 class Activity(Resource):
91 create_date = models.DateTimeField(_('Creation Date'), auto_now_add = True) 91 create_date = models.DateTimeField(_('Creation Date'), auto_now_add = True)
92 - topic = models.ForeignKey(Topic, verbose_name = _('Topic'), related_name="topic")  
93 - create_date = models.DateTimeField(_('Creation Date'), auto_now_add = True) 92 + topic = models.ForeignKey(Topic, verbose_name = _('Topic'))
94 limit_date = models.DateTimeField(_('Deliver Date')) 93 limit_date = models.DateTimeField(_('Deliver Date'))
95 - student = models.ForeignKey(User, verbose_name = _('student'), related_name="student")  
96 - grade = models.IntegerField(_('grade')) 94 + student = models.ForeignKey(User, verbose_name = _('student'))
  95 +
97 96
98 """ 97 """
99 -It is one kind of possible resources available inside a Topic. 98 +It represents any Material inside a topic, be it a file, a link, etc.
100 """ 99 """
101 -class Link(Resource):  
102 - url_field = models.CharField(_('url'), max_length= 300)  
103 \ No newline at end of file 100 \ No newline at end of file
  101 +class Material(Resource):
  102 + create_date = models.DateTimeField(_('Creation Date'), auto_now_add = True)
  103 + topic = models.ForeignKey(Topic, verbose_name = _('Topic'))
  104 + student = models.ForeignKey(User, verbose_name = _('student'))
  105 +
  106 +
courses/views.py
@@ -15,6 +15,7 @@ from rolepermissions.verifications import has_object_permission @@ -15,6 +15,7 @@ from rolepermissions.verifications import has_object_permission
15 from .forms import CourseForm, UpdateCourseForm, CategoryForm, SubjectForm,TopicForm 15 from .forms import CourseForm, UpdateCourseForm, CategoryForm, SubjectForm,TopicForm
16 from .models import Course, Subject, Category,Topic 16 from .models import Course, Subject, Category,Topic
17 from core.mixins import NotificationMixin 17 from core.mixins import NotificationMixin
  18 +from users.models import User
18 19
19 from datetime import date 20 from datetime import date
20 21
@@ -30,7 +31,7 @@ class IndexView(LoginRequiredMixin, NotificationMixin, generic.ListView): @@ -30,7 +31,7 @@ class IndexView(LoginRequiredMixin, NotificationMixin, generic.ListView):
30 def get_context_data(self, **kwargs): 31 def get_context_data(self, **kwargs):
31 context = super(IndexView, self).get_context_data(**kwargs) 32 context = super(IndexView, self).get_context_data(**kwargs)
32 context['categories'] = Category.objects.all() 33 context['categories'] = Category.objects.all()
33 - 34 + super.createNotification(users= User.obejcts.all(), message="testando a notificacao em login")
34 return context 35 return context
35 36
36 class CreateCourseView(LoginRequiredMixin, HasRoleMixin, NotificationMixin,generic.edit.CreateView): 37 class CreateCourseView(LoginRequiredMixin, HasRoleMixin, NotificationMixin,generic.edit.CreateView):
users/migrations/0001_initial.py
1 -# -*- coding: utf-8 -*-  
2 -# Generated by Django 1.9.7 on 2016-07-28 19:25  
3 -from __future__ import unicode_literals  
4 -  
5 -import django.contrib.auth.models  
6 -import django.core.validators  
7 -from django.db import migrations, models  
8 -import re  
9 -  
10 -  
11 -class Migration(migrations.Migration):  
12 -  
13 - initial = True  
14 -  
15 - dependencies = [  
16 - ('auth', '0007_alter_validators_add_error_messages'),  
17 - ]  
18 -  
19 - operations = [  
20 - migrations.CreateModel(  
21 - name='User',  
22 - fields=[  
23 - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),  
24 - ('password', models.CharField(max_length=128, verbose_name='password')),  
25 - ('last_login', models.DateTimeField(blank=True, null=True, verbose_name='last login')),  
26 - ('is_superuser', models.BooleanField(default=False, help_text='Designates that this user has all permissions without explicitly assigning them.', verbose_name='superuser status')),  
27 - ('login', models.CharField(help_text='Um nome curto que será usado para identificá-lo de forma única na plataforma e também para acessá-la', max_length=35, unique=True, validators=[django.core.validators.RegexValidator(re.compile('^[\\w.@+-]+$', 32), 'Informe um nome de usuário válido. Este valor deve conter apenas letras, números e os caracteres: @/./+/-/_ .', 'invalid')], verbose_name='Login')),  
28 - ('email', models.EmailField(max_length=254, unique=True, verbose_name='E-mail')),  
29 - ('name', models.CharField(blank=True, max_length=100, verbose_name='Nome')),  
30 - ('city', models.CharField(blank=True, max_length=90, verbose_name='Cidade')),  
31 - ('state', models.CharField(blank=True, max_length=30, verbose_name='Estado')),  
32 - ('gender', models.CharField(choices=[('M', 'Masculino'), ('F', 'Feminino')], max_length=1, verbose_name='Sexo')),  
33 - ('image', models.ImageField(blank=True, default='no_image.jpg', upload_to='users/', verbose_name='Imagem')),  
34 - ('birth_date', models.DateField(blank=True, verbose_name='Data de Nascimento')),  
35 - ('phone', models.CharField(blank=True, max_length=30, verbose_name='Telefone')),  
36 - ('cpf', models.CharField(blank=True, max_length=15, verbose_name='Cpf')),  
37 - ('type_profile', models.IntegerField(choices=[(1, 'Administrador'), (2, 'Professor'), (3, 'Aluno')], verbose_name='Tipo')),  
38 - ('date_created', models.DateTimeField(auto_now_add=True, verbose_name='Data de Cadastro')),  
39 - ('groups', models.ManyToManyField(blank=True, help_text='The groups this user belongs to. A user will get all permissions granted to each of their groups.', related_name='user_set', related_query_name='user', to='auth.Group', verbose_name='groups')),  
40 - ('user_permissions', models.ManyToManyField(blank=True, help_text='Specific permissions for this user.', related_name='user_set', related_query_name='user', to='auth.Permission', verbose_name='user permissions')),  
41 - ],  
42 - options={  
43 - 'verbose_name_plural': 'Usuários',  
44 - 'verbose_name': 'Usuário',  
45 - },  
46 - managers=[  
47 - ('objects', django.contrib.auth.models.UserManager()),  
48 - ],  
49 - ),  
50 - ] 1 +# -*- coding: utf-8 -*-
  2 +# Generated by Django 1.10 on 2016-09-20 13:57
  3 +from __future__ import unicode_literals
  4 +
  5 +import django.contrib.auth.models
  6 +import django.core.validators
  7 +from django.db import migrations, models
  8 +import re
  9 +
  10 +
  11 +class Migration(migrations.Migration):
  12 +
  13 + initial = True
  14 +
  15 + dependencies = [
  16 + ('auth', '0008_alter_user_username_max_length'),
  17 + ]
  18 +
  19 + operations = [
  20 + migrations.CreateModel(
  21 + name='User',
  22 + fields=[
  23 + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
  24 + ('password', models.CharField(max_length=128, verbose_name='password')),
  25 + ('last_login', models.DateTimeField(blank=True, null=True, verbose_name='last login')),
  26 + ('is_superuser', models.BooleanField(default=False, help_text='Designates that this user has all permissions without explicitly assigning them.', verbose_name='superuser status')),
  27 + ('username', 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')),
  28 + ('email', models.EmailField(max_length=254, unique=True, verbose_name='Mail')),
  29 + ('name', models.CharField(blank=True, max_length=100, verbose_name='Name')),
  30 + ('city', models.CharField(blank=True, max_length=90, verbose_name='City')),
  31 + ('state', models.CharField(blank=True, max_length=30, verbose_name='State')),
  32 + ('gender', models.CharField(choices=[('M', 'Male'), ('F', 'Female')], max_length=1, verbose_name='Gender')),
  33 + ('image', models.ImageField(blank=True, upload_to='users/', verbose_name='Image')),
  34 + ('birth_date', models.DateField(blank=True, null=True, verbose_name='Birth Date')),
  35 + ('phone', models.CharField(blank=True, max_length=30, verbose_name='Phone')),
  36 + ('cpf', models.CharField(blank=True, max_length=15, verbose_name='Cpf')),
  37 + ('type_profile', models.IntegerField(blank=True, choices=[(1, 'Professor'), (2, 'Student')], default=2, null=True, verbose_name='Type')),
  38 + ('date_created', models.DateTimeField(auto_now_add=True, verbose_name='Create Date')),
  39 + ('is_staff', models.BooleanField(default=False, verbose_name='Administrador')),
  40 + ('is_active', models.BooleanField(default=True, verbose_name='Active')),
  41 + ('groups', models.ManyToManyField(blank=True, help_text='The groups this user belongs to. A user will get all permissions granted to each of their groups.', related_name='user_set', related_query_name='user', to='auth.Group', verbose_name='groups')),
  42 + ('user_permissions', models.ManyToManyField(blank=True, help_text='Specific permissions for this user.', related_name='user_set', related_query_name='user', to='auth.Permission', verbose_name='user permissions')),
  43 + ],
  44 + options={
  45 + 'verbose_name': 'User',
  46 + 'verbose_name_plural': 'Users',
  47 + },
  48 + managers=[
  49 + ('objects', django.contrib.auth.models.UserManager()),
  50 + ],
  51 + ),
  52 + ]
users/migrations/0002_auto_20160728_1629.py
@@ -1,20 +0,0 @@ @@ -1,20 +0,0 @@
1 -# -*- coding: utf-8 -*-  
2 -# Generated by Django 1.9.7 on 2016-07-28 19:29  
3 -from __future__ import unicode_literals  
4 -  
5 -from django.db import migrations  
6 -  
7 -  
8 -class Migration(migrations.Migration):  
9 -  
10 - dependencies = [  
11 - ('users', '0001_initial'),  
12 - ]  
13 -  
14 - operations = [  
15 - migrations.RenameField(  
16 - model_name='user',  
17 - old_name='login',  
18 - new_name='username',  
19 - ),  
20 - ]  
users/migrations/0003_auto_20160728_1631.py
@@ -1,30 +0,0 @@ @@ -1,30 +0,0 @@
1 -# -*- coding: utf-8 -*-  
2 -# Generated by Django 1.9.7 on 2016-07-28 19:31  
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 - ('users', '0002_auto_20160728_1629'),  
12 - ]  
13 -  
14 - operations = [  
15 - migrations.AddField(  
16 - model_name='user',  
17 - name='is_active',  
18 - field=models.BooleanField(default=True, verbose_name='Ativo'),  
19 - ),  
20 - migrations.AddField(  
21 - model_name='user',  
22 - name='is_staff',  
23 - field=models.BooleanField(default=False, verbose_name='Administrador'),  
24 - ),  
25 - migrations.AlterField(  
26 - model_name='user',  
27 - name='type_profile',  
28 - field=models.IntegerField(choices=[(1, 'Professor'), (2, 'Aluno')], verbose_name='Tipo'),  
29 - ),  
30 - ]  
users/migrations/0004_auto_20160728_1634.py
@@ -1,20 +0,0 @@ @@ -1,20 +0,0 @@
1 -# -*- coding: utf-8 -*-  
2 -# Generated by Django 1.9.7 on 2016-07-28 19:34  
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 - ('users', '0003_auto_20160728_1631'),  
12 - ]  
13 -  
14 - operations = [  
15 - migrations.AlterField(  
16 - model_name='user',  
17 - name='birth_date',  
18 - field=models.DateField(blank=True, null=True, verbose_name='Data de Nascimento'),  
19 - ),  
20 - ]  
users/migrations/0005_auto_20160728_1636.py
@@ -1,20 +0,0 @@ @@ -1,20 +0,0 @@
1 -# -*- coding: utf-8 -*-  
2 -# Generated by Django 1.9.7 on 2016-07-28 19:36  
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 - ('users', '0004_auto_20160728_1634'),  
12 - ]  
13 -  
14 - operations = [  
15 - migrations.AlterField(  
16 - model_name='user',  
17 - name='type_profile',  
18 - field=models.IntegerField(blank=True, choices=[(1, 'Professor'), (2, 'Aluno')], null=True, verbose_name='Tipo'),  
19 - ),  
20 - ]  
users/migrations/0006_auto_20160815_0922.py
@@ -1,81 +0,0 @@ @@ -1,81 +0,0 @@
1 -# -*- coding: utf-8 -*-  
2 -# Generated by Django 1.9.7 on 2016-08-15 12:22  
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', '0005_auto_20160728_1636'),  
14 - ]  
15 -  
16 - operations = [  
17 - migrations.AlterModelOptions(  
18 - name='user',  
19 - options={'verbose_name': 'User', 'verbose_name_plural': 'Users'},  
20 - ),  
21 - migrations.AlterField(  
22 - model_name='user',  
23 - name='birth_date',  
24 - field=models.DateField(blank=True, null=True, verbose_name='Birth Date'),  
25 - ),  
26 - migrations.AlterField(  
27 - model_name='user',  
28 - name='city',  
29 - field=models.CharField(blank=True, max_length=90, verbose_name='City'),  
30 - ),  
31 - migrations.AlterField(  
32 - model_name='user',  
33 - name='date_created',  
34 - field=models.DateTimeField(auto_now_add=True, verbose_name='Create Date'),  
35 - ),  
36 - migrations.AlterField(  
37 - model_name='user',  
38 - name='email',  
39 - field=models.EmailField(max_length=254, unique=True, verbose_name='Mail'),  
40 - ),  
41 - migrations.AlterField(  
42 - model_name='user',  
43 - name='gender',  
44 - field=models.CharField(choices=[('M', 'Male'), ('F', 'Female')], max_length=1, verbose_name='Gender'),  
45 - ),  
46 - migrations.AlterField(  
47 - model_name='user',  
48 - name='image',  
49 - field=models.ImageField(blank=True, default='no_image.jpg', upload_to='users/', verbose_name='Image'),  
50 - ),  
51 - migrations.AlterField(  
52 - model_name='user',  
53 - name='is_active',  
54 - field=models.BooleanField(default=True, verbose_name='Active'),  
55 - ),  
56 - migrations.AlterField(  
57 - model_name='user',  
58 - name='name',  
59 - field=models.CharField(blank=True, max_length=100, verbose_name='Name'),  
60 - ),  
61 - migrations.AlterField(  
62 - model_name='user',  
63 - name='phone',  
64 - field=models.CharField(blank=True, max_length=30, verbose_name='Phone'),  
65 - ),  
66 - migrations.AlterField(  
67 - model_name='user',  
68 - name='state',  
69 - field=models.CharField(blank=True, max_length=30, verbose_name='State'),  
70 - ),  
71 - migrations.AlterField(  
72 - model_name='user',  
73 - name='type_profile',  
74 - field=models.IntegerField(blank=True, choices=[(1, 'Professor'), (2, 'Student')], null=True, verbose_name='Type'),  
75 - ),  
76 - migrations.AlterField(  
77 - model_name='user',  
78 - name='username',  
79 - 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'),  
80 - ),  
81 - ]  
users/migrations/0007_auto_20160825_1801.py
@@ -1,22 +0,0 @@ @@ -1,22 +0,0 @@
1 -# -*- coding: utf-8 -*-  
2 -# Generated by Django 1.10 on 2016-08-25 21:01  
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', '0006_auto_20160815_0922'),  
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/0008_auto_20160902_2123.py
@@ -1,27 +0,0 @@ @@ -1,27 +0,0 @@
1 -# -*- coding: utf-8 -*-  
2 -# Generated by Django 1.10 on 2016-09-03 00:23  
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', '0007_auto_20160825_1801'),  
14 - ]  
15 -  
16 - operations = [  
17 - migrations.AlterField(  
18 - model_name='user',  
19 - name='type_profile',  
20 - field=models.IntegerField(blank=True, choices=[(1, 'Professor'), (2, 'Student')], default=2, null=True, verbose_name='Type'),  
21 - ),  
22 - migrations.AlterField(  
23 - model_name='user',  
24 - name='username',  
25 - 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'),  
26 - ),  
27 - ]  
users/migrations/0009_auto_20160906_1450.py
@@ -1,22 +0,0 @@ @@ -1,22 +0,0 @@
1 -# -*- coding: utf-8 -*-  
2 -# Generated by Django 1.10 on 2016-09-06 17:50  
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', '0008_auto_20160902_2123'),  
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/0010_auto_20160906_2332.py
@@ -1,22 +0,0 @@ @@ -1,22 +0,0 @@
1 -# -*- coding: utf-8 -*-  
2 -# Generated by Django 1.9.7 on 2016-09-07 02:32  
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', '0009_auto_20160906_1450'),  
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/migrations/0011_auto_20160908_1108.py
@@ -1,22 +0,0 @@ @@ -1,22 +0,0 @@
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
@@ -1,22 +0,0 @@ @@ -1,22 +0,0 @@
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/migrations/0013_auto_20160915_2334.py
@@ -1,20 +0,0 @@ @@ -1,20 +0,0 @@
1 -# -*- coding: utf-8 -*-  
2 -# Generated by Django 1.10 on 2016-09-16 02:34  
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 - ('users', '0012_auto_20160908_1625'),  
12 - ]  
13 -  
14 - operations = [  
15 - migrations.AlterField(  
16 - model_name='user',  
17 - name='image',  
18 - field=models.ImageField(blank=True, upload_to='users/', verbose_name='Image'),  
19 - ),  
20 - ]