From 7049a800bc2308bbed701130bf44d264658cfe37 Mon Sep 17 00:00:00 2001 From: Zambom Date: Fri, 24 Feb 2017 00:53:27 -0300 Subject: [PATCH] Adding topic goals initial form creation (Not working yet) --- amadeus/settings.py | 1 + amadeus/static/css/.sass-cache/a7f87b90919294b62ab4f8079e31dcda8f485534/green.sassc | Bin 147921 -> 0 bytes amadeus/static/css/base/amadeus.css | 4 ++-- amadeus/static/css/themes/green.css | 4 ++-- amadeus/static/css/themes/green.css.map | 2 +- amadeus/static/css/themes/green.sass | 4 ++-- amadeus/static/js/resources.js | 6 ++++++ amadeus/urls.py | 1 + categories/migrations/0014_auto_20170224_0023.py | 21 +++++++++++++++++++++ goals/__init__.py | 0 goals/admin.py | 3 +++ goals/apps.py | 5 +++++ goals/forms.py | 94 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ goals/migrations/0001_initial.py | 45 +++++++++++++++++++++++++++++++++++++++++++++ goals/migrations/__init__.py | 0 goals/models.py | 35 +++++++++++++++++++++++++++++++++++ goals/templates/goals/_form.html | 460 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ goals/templates/goals/create.html | 35 +++++++++++++++++++++++++++++++++++ goals/tests.py | 3 +++ goals/urls.py | 8 ++++++++ goals/views.py | 134 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ mural/migrations/0008_auto_20170224_0023.py | 26 ++++++++++++++++++++++++++ pendencies/forms.py | 75 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++- pendencies/migrations/0006_auto_20170224_0023.py | 20 ++++++++++++++++++++ pendencies/models.py | 2 +- topics/templates/topics/list.html | 1 + 26 files changed, 980 insertions(+), 9 deletions(-) create mode 100644 categories/migrations/0014_auto_20170224_0023.py create mode 100644 goals/__init__.py create mode 100644 goals/admin.py create mode 100644 goals/apps.py create mode 100644 goals/forms.py create mode 100644 goals/migrations/0001_initial.py create mode 100644 goals/migrations/__init__.py create mode 100644 goals/models.py create mode 100644 goals/templates/goals/_form.html create mode 100644 goals/templates/goals/create.html create mode 100644 goals/tests.py create mode 100644 goals/urls.py create mode 100644 goals/views.py create mode 100644 mural/migrations/0008_auto_20170224_0023.py create mode 100644 pendencies/migrations/0006_auto_20170224_0023.py diff --git a/amadeus/settings.py b/amadeus/settings.py index dba55dd..c164472 100644 --- a/amadeus/settings.py +++ b/amadeus/settings.py @@ -68,6 +68,7 @@ INSTALLED_APPS = [ 'pendencies', 'mural', 'file_link', + 'goals', 'pdf_file', 'links', 'webpage', diff --git a/amadeus/static/css/.sass-cache/a7f87b90919294b62ab4f8079e31dcda8f485534/green.sassc b/amadeus/static/css/.sass-cache/a7f87b90919294b62ab4f8079e31dcda8f485534/green.sassc index a16cbbc..a6de28a 100644 Binary files a/amadeus/static/css/.sass-cache/a7f87b90919294b62ab4f8079e31dcda8f485534/green.sassc and b/amadeus/static/css/.sass-cache/a7f87b90919294b62ab4f8079e31dcda8f485534/green.sassc differ diff --git a/amadeus/static/css/base/amadeus.css b/amadeus/static/css/base/amadeus.css index 8f94ed0..78e07c5 100755 --- a/amadeus/static/css/base/amadeus.css +++ b/amadeus/static/css/base/amadeus.css @@ -747,7 +747,7 @@ a:focus { } /* end jPages */ -.notifies { +.notifies, .goalitems { padding: 5px 20px; text-align: right; margin-bottom: 10px; @@ -761,7 +761,7 @@ a:focus { font-weight: 700; } -.notifies a.delete-row { +.notifies a.delete-row, .goalitems a.delete-row { padding: 5px 20px; font-size: 12px; border: none; diff --git a/amadeus/static/css/themes/green.css b/amadeus/static/css/themes/green.css index 7f7a588..7dda01c 100644 --- a/amadeus/static/css/themes/green.css +++ b/amadeus/static/css/themes/green.css @@ -316,13 +316,13 @@ a, a:focus, a:hover { border-color: #039BE5; } /* Pendencies Form */ -.notifies { +.notifies, .goalitems { border: 1px solid #EEEEEE; } .bootstrap-datetimepicker-widget { background-color: #fff; } -.notifies a.delete-row { +.notifies a.delete-row, .goalitems a.delete-row { -webkit-box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 3px 1px -2px rgba(0, 0, 0, 0.2), 0 1px 5px 0 rgba(0, 0, 0, 0.12); box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 3px 1px -2px rgba(0, 0, 0, 0.2), 0 1px 5px 0 rgba(0, 0, 0, 0.12); background-color: #EEE; diff --git a/amadeus/static/css/themes/green.css.map b/amadeus/static/css/themes/green.css.map index c4bb780..4315110 100644 --- a/amadeus/static/css/themes/green.css.map +++ b/amadeus/static/css/themes/green.css.map @@ -1,6 +1,6 @@ { "version": 3, -"mappings": "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", +"mappings": "AAOA,gJAAgJ;EAC5I,gBAAgB,EAAE,KAAK;;AAG3B,mBAAmB;EACf,KAAK,EAXO,OAAO;;AAcvB,gGAA4F;EACxF,gBAAgB,EAfJ,OAAO;;AAkBvB,kGAA8F;EAC1F,YAAY,EAnBA,OAAO;;AAsBvB,iMAAiM;EAC7L,KAAK,EAAE,IAAI;EACX,gBAAgB,EAxBJ,OAAO;EAyBnB,YAAY,EAzBA,OAAO;;AA4BvB,+BAA+B;EAC3B,gBAAgB,EA7BJ,OAAO;EA8BnB,KAAK,EAAE,yBAAqB;;AAGhC,aAAa;EACT,gBAAgB,EAAE,kBAAkB;;AAGxC,YAAY;EACR,UAAU,EAtCE,OAAO;;AAyCvB,iBAAiB;EACb,UAAU,EAzCI,OAAO;;;AA+CzB,+CAA+C;EAC3C,UAAU,EAAE,OAAO;EACnB,KAAK,EAlDO,OAAO;;AAqDvB,qDAAqD;EACjD,KAAK,EAtDO,OAAO;;;AA2DvB,mBAAmB;EACf,gBAAgB,EA5DJ,OAAO;EA6DnB,KAAK,EAAE,KAAK;;AAGhB,qBAAqB;EACjB,KAAK,EAAE,KAAK;;AAGhB,qCAAqC;EACjC,gBAAgB,EApEF,OAAO;;AAuEzB,2BAA2B;EACvB,gBAAgB,EAxEF,OAAO;;;;AA+EzB,qBAAsB;EAClB,KAAK,EAAE,OAAO;;AAGlB,mBAAoB;EAChB,KAAK,EAAE,OAAO;;AAGlB,sBAAsB;EAClB,KAAK,EAAG,OAAO;;AAGnB,oBAAqB;EACjB,KAAK,EAAE,OAAO;;AAIlB,kBAAkB;EACd,KAAK,EAAE,OAAO;;AAIlB,gBAAgB;EACZ,gBAAgB,EAAE,kBAAkB;EACpC,KAAK,EAtGO,OAAO;;AAyGvB,gCAAgC;EAC5B,gBAAgB,EAAE,kBAAkB;;AAGxC,uDAAuD;EACnD,KAAK,EAAE,OAAO;;AAGlB,6DAA6D;EACzD,KAAK,EAjHD,OAAO;;AAoHf,+BAA+B;EAC3B,gBAAgB,EAAE,kBAAkB;;AAGxC,sDAAsD;EAClD,KAAK,EAAE,OAAO;;AAGlB,4DAA4D;EACxD,KAAK,EA7HD,OAAO;;AAgIf,cAAc;EACV,KAAK,EAAE,kBAAkB;;;AAK7B,aAAa;EACT,aAAa,EAAE,4BAA8B;;AAGjD,aAAa;EACT,UAAU,EAAE,4BAA8B;;;AAM9C,eAAe;EACX,gBAAgB,EAAE,kBAAkB;EACpC,KAAK,EAAE,KAAK;;;AAKhB,6BAA6B;EACzB,gBAAgB,EAAE,kBAAiB;;AAGvC,8FAA8F;EAC1F,KAAK,EAAE,kBAAkB;;AAG7B,iBAAiB;EACb,UAAU,EAAE,kBAAiB;EAC7B,UAAU,EAAE,iBAAiB;;;AAKjC,6BAA6B;EACzB,gBAAgB,EAAE,kBAAkB;;AAGxC,oHAAoH;EAChH,KAAK,EAAE,OAAO;;AAGlB,gIAAgI;EAC5H,KAAK,EAhLD,OAAO;;AAmLf,wFAAwF;EACpF,UAAU,EApLN,OAAO;;AAuLf,uCAAuC;EACnC,gBAAgB,EAAE,kBAAkB;EACpC,KAAK,EA1LO,OAAO;;AA6LvB,mBAAmB;EACf,UAAU,EA7LN,OAAO;;AAgMf,6CAA6C;EACzC,UAAU,EAlME,OAAO;;AAqMvB,kBAAkB;EACd,KAAK,EAAE,KAAK;;AAGhB,wBAAwB;EACpB,KAAK,EAAE,OAAO;;AAGlB,iCAAiC;EAC7B,KAAK,EAAE,kBAAkB;;AAG7B,gBAAgB;EACZ,gBAAgB,EAAE,OAAO;EACzB,KAAK,EAlND,OAAO;;AAqNf,uBAAuB;EACnB,UAAU,EAvNE,OAAO;;AA0NvB,yBAA0B;EACtB,gBAAgB,EA1NZ,OAAO;EA2NX,mBAAmB,EAAE,OAAO;EAC5B,KAAK,EAAE,OAAO;;AAGlB,gCAAiC;EAC7B,KAAK,EAAE,OAAO;EACd,mBAAmB,EAnOL,OAAO;;AAsOzB,mBAAmB;EACf,gBAAgB,EAAE,OAAO;EACzB,KAAK,EAAE,KAAK;;AAGhB,4EAA4E;EACxE,UAAU,EA1ON,OAAO;;;AAkPf,mBAAmB;EACf,UAAU,EAAE,kBAA2B;;AAG3C,qBAAqB;EACjB,KAAK,EAAE,KAAK;;AAGhB,mBAAmB;EACf,UAAU,EA7PI,OAAO;;AAgQzB,wBAAwB;EACpB,UAAU,EAAE,kBAA2B;;AAG3C,mCAAmC;EAC/B,UAAU,EArQI,OAAO;;AAwQzB,WAAW;EACP,KAAK,EAxQO,OAAO;;AA4QvB,cAAc;EACV,UAAU,EA7QE,OAAO;;AAgRvB,qBAAqB;EACjB,UAAU,EAjRE,OAAO;EAkRnB,KAAK,EAAE,OAAO;;AAGlB,2BAA2B;EACvB,UAAU,EAAE,kBAAkB;;AAGlC,2CAA2C;EACvC,UAAU,EA1RE,OAAO;;AA6RvB,iDAAiD;EAC7C,UAAU,EAAE,OAAO;;AAGvB,8DAA8D;EAC1D,KAAK,EAAE,OAAO;;AAGlB,oEAAoE;EAChE,KAAK,EAxSO,OAAO;;AA2SvB,qDAAqD;EACjD,KAAK,EA5SO,OAAO;;AA+SvB,YAAY;EACR,UAAU,EA9SE,OAAO;;AAkTvB,gBAAgB;EACZ,gBAAgB,EAAE,KAAK;;AAG3B,+BAA+B;EAC3B,KAAK,EAAE,OAAO;;AAGlB,oBAAoB;EAChB,KAAK,EAAE,OAAO;;AAGlB,gBAAgB;EACZ,KAAK,EAAE,OAAO;;;AAGlB,YAAY;EACR,KAAK,EAAE,yBAAqB;;AAGhC,sCAAsC;EAClC,KAAK,EAtUD,OAAO;;AAyUf,UAAU;EACN,UAAU,EAAE,KAAK;;AAGrB,eAAe;EACX,UAAU,EA/UE,OAAO;;AAkVvB,cAAc;EACV,KAAK,EAAE,OAAO;;AAGlB,gCAAgC;EAC5B,KAAK,EAAE,KAAK;;AAGhB,kBAAkB;EACd,KAAK,EAAE,KAAK;;AAGhB,sCAAsC;EAClC,KAAK,EAAE,KAAK;;AAEhB,uBAAuB;EACnB,KAAK,EAAE,IAAI;;AAGf,qBAAqB;EACjB,KAAK,EAAE,kBAAiB;;AAG5B,iBAAiB;EACb,aAAa,EAAE,iBAAiB;;AAIpC,kBAAkB;EACd,KAAK,EA9WD,OAAO;EA+WX,UAAU,EAlXE,OAAO;;AAqXvB,oBAAoB;EAChB,KAAK,EAAE,KAAK;;AAGhB,oCAAoC;EAChC,gBAAgB,EAzXF,OAAO;;AA4XzB,0BAA0B;EACtB,gBAAgB,EA7XF,OAAO;;AAiYzB,iBAAiB;EACb,aAAa,EAAE,iBAAiB;;AAGpC,kBAAkB;EACd,gBAAgB,EAAE,kBAAkB;EACpC,KAAK,EAAE,KAAK;;AAGhB,SAAS;EACL,KAAK,EAAE,IAAI;EACX,MAAM,EAAE,eAAe;;AAG3B,OAAO;EACH,KAAK,EA9YD,OAAO;EA+YX,UAAU,EAAE,OAAO;;AAGvB,YAAY;EACR,KAAK,EAAE,OAAO;;AAGlB,0CAA0C;EACtC,UAAU,EAAE,eAAe;EAC3B,KAAK,EAAE,eAAe;;AAG1B,wCAAwC;EACpC,UAAU,EAAE,IAAI;;AAGpB,uBAAuB;EACnB,MAAM,EAAE,cAAc;EACtB,KAAK,EAAE,OAAO;;AAGlB,eAAe;EACX,KAAK,EAAE,OAAO;EACd,gBAAgB,EAAE,IAAI;EACtB,YAAY,EAAE,IAAI;;AAGtB,wCAAwC;EACpC,UAAU,EAAE,OAAO;EACnB,KAAK,EA5aD,OAAO;EA6aX,YAAY,EAAE,OAAO;;;AAMzB,qBAAqB;EACjB,MAAM,EAAE,iBAAiB;;AAG7B,gCAAgC;EAC5B,gBAAgB,EAAE,IAAI;;AAG1B,+CAA+C;EAC3C,kBAAkB,EAAE,mGAAqF;EACzG,UAAU,EAAE,mGAAqF;EACjG,gBAAgB,EAAE,IAAI;EACtB,KAAK,EAAE,mBAAe;;AAG1B,SAAS;EACL,kBAAkB,EAAE,mGAAqF;EACzG,UAAU,EAAE,mGAAqF;EACjG,gBAAgB,EAAE,OAAO;EACzB,KAAK,EAAE,yBAAqB;;;AAKhC,iCAAiC;EAC7B,gBAAgB,EAAE,IAAI;EACtB,MAAM,EAAE,cAAc;;AAG1B,0BAA0B;EACtB,gBAAgB,EAAE,IAAI;;AAG1B,gCAAgC;EAC5B,gBAAgB,EAAE,eAAe;;AAGrC,0CAA0C;EACtC,KAAK,EAAE,OAAO;;AAGlB,uCAAuC;EACnC,UAAU,EA9dE,OAAO;;AAievB,4CAA4C;EACxC,aAAa,EAAE,yBAAyB;;AAG5C,qCAAqC;EACjC,KAAK,EAAE,OAAO;;AAGlB,2CAA2C;EACvC,KAAK,EAAE,OAAO;;AAGlB,oDAAoD;EAChD,KAAK,EAAE,IAAI;;AAGf,gBAAgB;EACZ,KAAK,EAAE,OAAO;;AAGlB,uHAAuH;EACnH,gBAAgB,EAAE,kBAAkB;;AAKxC,qBAAqB;EACjB,KAAK,EAAE,OAAO;;AAIlB,iBAAiB;EACb,gBAAgB,EAAE,kBAAkB;EACpC,KAAK,EAAE,kBAAyB;;AAGpC,SAAS;EACL,YAAY,EAAE,OAAO;;AAGzB,qBAAqB;EACjB,gBAAgB,EAzgBZ,OAAO;;AA4gBf,eAAe;EACX,KAAK,EAAE,OAAO;;AAGlB,yBAAyB;EACrB,gBAAgB,EAAE,OAAO;EACzB,KAAK,EAlhBD,OAAO;;AAqhBf,qDAAqD;EACjD,gBAAgB,EAAE,kBAAkB;;AAGxC,QAAQ;EACJ,UAAU,EAAE,IAAI;EAChB,KAAK,EAAE,IAAI;;AAGf,iBAAiB;EACb,UAAU,EA/hBN,OAAO;;AAkiBf,0GAA0G;EACtG,UAAU,EAAE,OAAO;;AAGvB,iCAAiC;EAC7B,YAAY,EAAE,OAAO;;AAGzB,gCAAgC;EAC5B,KAAK,EAAE,OAAO;;AAGlB,sFAAsF;EAClF,KAAK,EAAE,OAAO;;AAGlB,sEAAsE;EAClE,KAAK,EAAE,OAAO;;AAGlB,6BAA6B;EACzB,KAAK,EAAE,OAAO;;AAGlB,WAAW;EACP,KAAK,EAAE,OAAO;;AAGlB,mBAAmB;EACf,gBAAgB,EAAE,OAAO;EACzB,UAAU,EAAE,OAAO;;AAGvB,sCAAsC;EAClC,YAAY,EAAE,OAAO;EACrB,UAAU,EArkBN,OAAO;;AAwkBf,gBAAgB;EACZ,UAAU,EA1kBE,OAAO;EA2kBnB,gBAAgB,EAAE,OAAO;;AAG7B,mCAAmC;EAC/B,KAAK,EAAE,OAAO;;AAGlB,aAAa;EACT,KAAK,EAAE,OAAO;;AAGlB,UAAU;EACN,KAAK,EAAE,kBAAkB;;AAG7B,QAAQ;EACJ,KAAK,EAAE,kBAAkB;;AAG7B,YAAY;EACR,UAAU,EA/lBE,OAAO;;AAkmBvB,eAAe;EACX,KAAK,EAAE,OAAO;;AAId,kBAAK;EACD,KAAK,EAAE,OAAO;;AAIlB,cAAC;EACG,KAAK,EAAE,OAAO;;AAGtB,YAAY;EACR,UAAU,EAhnBN,OAAO;;AAmnBf,gBAAgB;EACZ,UAAU,EAAE,IAAI;;AAGpB,gNAAgN;EAC5M,gBAAgB,EAAE,OAAO;;;EAKzB,mDAAmD;IAC/C,KAAK,EAAE,kBAAkB;;EAE7B,yDAAyD;IACrD,KAAK,EAAE,kBAAyB", "sources": ["green.sass"], "names": [], "file": "green.css" diff --git a/amadeus/static/css/themes/green.sass b/amadeus/static/css/themes/green.sass index 9a3d6b5..3affc54 100644 --- a/amadeus/static/css/themes/green.sass +++ b/amadeus/static/css/themes/green.sass @@ -437,7 +437,7 @@ a, a:focus, a:hover /* Pendencies Form */ -.notifies +.notifies, .goalitems border: 1px solid #EEEEEE @@ -445,7 +445,7 @@ a, a:focus, a:hover background-color: #fff -.notifies a.delete-row +.notifies a.delete-row, .goalitems a.delete-row -webkit-box-shadow: 0 2px 2px 0 rgba(0,0,0,.14),0 3px 1px -2px rgba(0,0,0,.2),0 1px 5px 0 rgba(0,0,0,.12) box-shadow: 0 2px 2px 0 rgba(0,0,0,.14),0 3px 1px -2px rgba(0,0,0,.2),0 1px 5px 0 rgba(0,0,0,.12) background-color: #EEE diff --git a/amadeus/static/js/resources.js b/amadeus/static/js/resources.js index 37e7508..ddf6cbc 100644 --- a/amadeus/static/js/resources.js +++ b/amadeus/static/js/resources.js @@ -98,6 +98,12 @@ $('.end_date_input').on('click', function () { $(checkbox).prop('checked', true); }); +$('.limit_date_input').on('click', function () { + var checkbox = $(this).parent().parent().find('.limit_date'); + + $(checkbox).prop('checked', true); +}); + // check if browser supports drag n drop // call initialization file if (window.File && window.FileList && window.FileReader) { diff --git a/amadeus/urls.py b/amadeus/urls.py index 07c34c9..8ecacb1 100644 --- a/amadeus/urls.py +++ b/amadeus/urls.py @@ -34,6 +34,7 @@ urlpatterns = [ url(r'^webpages/', include('webpage.urls', namespace = 'webpages')), url(r'^ytvideo/', include('youtube_video.urls', namespace = 'youtube')), url(r'^file_links/', include('file_link.urls', namespace = 'file_links')), + url(r'^goals/', include('goals.urls', namespace = 'goals')), url(r'^mailsender/', include('mailsender.urls', namespace = 'mailsender')), url(r'^security/', include('security.urls', namespace = 'security')), url(r'^themes/', include('themes.urls', namespace = 'themes')), diff --git a/categories/migrations/0014_auto_20170224_0023.py b/categories/migrations/0014_auto_20170224_0023.py new file mode 100644 index 0000000..1145cc7 --- /dev/null +++ b/categories/migrations/0014_auto_20170224_0023.py @@ -0,0 +1,21 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.10 on 2017-02-24 03:23 +from __future__ import unicode_literals + +from django.conf import settings +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('categories', '0013_auto_20170203_1618'), + ] + + operations = [ + migrations.AlterField( + model_name='category', + name='coordinators', + field=models.ManyToManyField(blank=True, related_name='coordinators', to=settings.AUTH_USER_MODEL), + ), + ] diff --git a/goals/__init__.py b/goals/__init__.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/goals/__init__.py diff --git a/goals/admin.py b/goals/admin.py new file mode 100644 index 0000000..8c38f3f --- /dev/null +++ b/goals/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git a/goals/apps.py b/goals/apps.py new file mode 100644 index 0000000..cc93b0d --- /dev/null +++ b/goals/apps.py @@ -0,0 +1,5 @@ +from django.apps import AppConfig + + +class GoalsConfig(AppConfig): + name = 'goals' diff --git a/goals/forms.py b/goals/forms.py new file mode 100644 index 0000000..448cf1c --- /dev/null +++ b/goals/forms.py @@ -0,0 +1,94 @@ +# coding=utf-8 +from django import forms +from django.conf import settings +from django.utils.translation import ugettext_lazy as _ +from django.forms.models import inlineformset_factory + +from subjects.models import Tag + +from pendencies.forms import PendenciesLimitedForm +from pendencies.models import Pendencies + +from .models import Goals, GoalItem + +class GoalsForm(forms.ModelForm): + subject = None + control_subject = forms.CharField(widget = forms.HiddenInput()) + + def __init__(self, *args, **kwargs): + super(GoalsForm, self).__init__(*args, **kwargs) + + self.subject = kwargs['initial'].get('subject', None) + + if self.instance.id: + self.subject = self.instance.topic.subject + self.initial['tags'] = ", ".join(self.instance.tags.all().values_list("name", flat = True)) + + self.initial['control_subject'] = self.subject.id + + tags = forms.CharField(label = _('Tags'), required = False) + limit_submission_date = forms.DateTimeField(input_formats = settings.DATETIME_INPUT_FORMATS) + + class Meta: + model = Goals + fields = ['name', 'presentation', 'brief_description', 'show_window', 'visible'] + labels = { + 'name': _('Name'), + } + widgets = { + 'presentation': forms.Textarea, + 'brief_description': forms.Textarea, + } + + def clean(self): + cleaned_data = super(GoalsForm, self).clean() + + topic = cleaned_data.get('topic', None) + + if topic: + if self.instance.id: + exist = topic.resource_topic.filter(goals__isnull = False).exclude(id = self.instance.id).exists() + else: + exist = topic.resource_topic.filter(goals__isnull = False).exists() + + if exist: + self.add_error('name', _('There already is another resource with the goals specification for the Topic %s')%(str(topic))) + + return cleaned_data + + def save(self, commit = True): + super(GoalsForm, self).save(commit = True) + + self.instance.save() + + previous_tags = self.instance.tags.all() + + tags = self.cleaned_data['tags'].split(",") + + #Excluding unwanted tags + for prev in previous_tags: + if not prev.name in tags: + self.instance.tags.remove(prev) + + for tag in tags: + tag = tag.strip() + + exist = Tag.objects.filter(name = tag).exists() + + if exist: + new_tag = Tag.objects.get(name = tag) + else: + new_tag = Tag.objects.create(name = tag) + + if not new_tag in self.instance.tags.all(): + self.instance.tags.add(new_tag) + + return self.instance + +class GoalItemForm(forms.ModelForm): + class Meta: + model = GoalItem + fields = ['description', 'ref_value'] + +InlinePendenciesFormset = inlineformset_factory(Goals, Pendencies, form = PendenciesLimitedForm, extra = 1, max_num = 3, validate_max = True, can_delete = True) +InlineGoalItemFormset = inlineformset_factory(Goals, GoalItem, form = GoalItemForm, extra = 1, can_delete = True) \ No newline at end of file diff --git a/goals/migrations/0001_initial.py b/goals/migrations/0001_initial.py new file mode 100644 index 0000000..2b0bcff --- /dev/null +++ b/goals/migrations/0001_initial.py @@ -0,0 +1,45 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.10 on 2017-02-24 03:23 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ('topics', '0007_auto_20170123_1911'), + ] + + operations = [ + migrations.CreateModel( + name='GoalItem', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('description', models.CharField(max_length=255, verbose_name='Description')), + ('ref_value', models.IntegerField(verbose_name='Referential Value')), + ('order', models.PositiveSmallIntegerField(null=True, verbose_name='Order')), + ], + ), + migrations.CreateModel( + name='Goals', + fields=[ + ('resource_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='topics.Resource')), + ('presentation', models.TextField(blank=True, verbose_name='Presentation')), + ('limit_submission_date', models.DateTimeField(verbose_name='Submission Limit Date')), + ], + options={ + 'verbose_name_plural': 'Goals', + 'verbose_name': 'Goal', + }, + bases=('topics.resource',), + ), + migrations.AddField( + model_name='goalitem', + name='goal', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='item_goal', to='goals.Goals', verbose_name='Goal'), + ), + ] diff --git a/goals/migrations/__init__.py b/goals/migrations/__init__.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/goals/migrations/__init__.py diff --git a/goals/models.py b/goals/models.py new file mode 100644 index 0000000..9cc4e01 --- /dev/null +++ b/goals/models.py @@ -0,0 +1,35 @@ +from django.db import models +from django.core.exceptions import ValidationError +from django.utils.translation import ugettext_lazy as _ +from django.core.urlresolvers import reverse_lazy + +from topics.models import Resource + +class Goals(Resource): + presentation = models.TextField(_('Presentation'), blank = True) + limit_submission_date = models.DateTimeField(_('Submission Limit Date')) + + class Meta: + verbose_name = _('Goal') + verbose_name_plural = _('Goals') + + def __str__(self): + return self.name + + def access_link(self): + return reverse_lazy('file_links:download', args = (), kwargs = {'slug': self.slug}) + + def update_link(self): + return 'file_links:update' + + def delete_link(self): + return 'file_links:delete' + + def delete_message(self): + return _('Are you sure you want delete the goals') + +class GoalItem(models.Model): + description = models.CharField(_('Description'), max_length = 255) + ref_value = models.IntegerField(_('Referential Value')) + order = models.PositiveSmallIntegerField(_('Order'), null = True) + goal = models.ForeignKey(Goals, verbose_name = _('Goal'), related_name = 'item_goal') \ No newline at end of file diff --git a/goals/templates/goals/_form.html b/goals/templates/goals/_form.html new file mode 100644 index 0000000..4bbf6b6 --- /dev/null +++ b/goals/templates/goals/_form.html @@ -0,0 +1,460 @@ +{% load static i18n %} +{% load widget_tweaks %} + +
+ {% csrf_token %} + + {% render_field form.control_subject %} + +
+ + {% render_field form.name class='form-control' %} + + {{ form.name.help_text }} + + {% if form.name.errors %} + + {% endif %} +
+ +
+ + {% render_field form.presentation class='form-control text_wysiwyg' %} + + {{ form.presentation.help_text }} + + {% if form.presentation.errors %} + + {% endif %} +
+ +
+
+ +
+ {{ goalitems_form.management_form }} + {{ goalitems_form.non_form_errors }} + + {% for item in goalitems_form %} +
+
+ {% render_field item.id %} + + {% if item.instance.pk %}{{ item.DELETE }}{% endif %} + +
+ +
+ {% render_field item.description class='form-control' %} +
+ +
+ + {{ item.description.help_text }} + + {% if item.description.errors %} + + {% endif %} +
+
+
+ +
+ {% render_field item.ref_value class='form-control' %} +
+ +
+ + {{ item.ref_value.help_text }} + + {% if item.ref_value.errors %} + + {% endif %} +
+
+
+ {% endfor %} +
+
+ +
+ +
+ + {% render_field form.limit_submission_date class='form-control datetime-picker' %} + + {{ form.limit_submission_date.help_text }} + + {% if form.limit_submission_date.errors %} + + {% endif %} +
+ + {% trans 'Common resources settings' %} + +
+ + {% render_field form.brief_description class='form-control text_wysiwyg' %} + + {{ form.brief_description.help_text }} + + {% if form.brief_description.errors %} + + {% endif %} +
+ +
+ + {% render_field form.tags class='form-control' data-role="tagsinput" %} + + {{ form.tags.help_text }} + + {% if form.tags.errors %} + + {% endif %} +
+ +
+ +
+ {{ pendencies_form.management_form }} + {{ pendencies_form.non_form_errors }} + + {% for notify in pendencies_form %} +
+
+ {% render_field notify.id %} + {% render_field notify.resource %} + {% render_field notify.subject class='pend_subj' %} + + {% if notify.instance.pk %}{{ notify.DELETE }}{% endif %} + +
+ +
+ {% render_field notify.action class='form-control' %} +
+ +
+ + {{ notify.action.help_text }} + + {% if notify.action.errors %} + + {% endif %} +
+
+
+
+

{% trans 'Wished period' %}:

+
+
+
+
+ +
+
+ {% render_field notify.begin_date class='form-control datetime-picker begin_date_input' %} +
+
+
+ {{ notify.begin_date.help_text }} + + {% if notify.begin_date.errors %} + + {% endif %} +
+
+
+ +
+
+ {% render_field notify.end_date class='form-control datetime-picker end_date_input' %} +
+
+
+ {{ notify.end_date.help_text }} + + {% if notify.end_date.errors %} + + {% endif %} +
+
+
+ +
+
+ {% render_field notify.limit_date class='form-control datetime-picker limit_date_input' %} +
+
+
+ {{ notify.limit_date.help_text }} + + {% if notify.limit_date.errors %} + + {% endif %} +
+
+
+ {% endfor %} +
+
+
+ +
+
+ +
+ + {{ form.show_window.help_text }} + + {% if form.show_window.errors %} + + {% endif %} +
+ +
+
+ +
+ + {{ form.visible.help_text }} + + {% if form.visible.errors %} + + {% endif %} +
+ +
+
+ +
+
+
+ + \ No newline at end of file diff --git a/goals/templates/goals/create.html b/goals/templates/goals/create.html new file mode 100644 index 0000000..b3ad854 --- /dev/null +++ b/goals/templates/goals/create.html @@ -0,0 +1,35 @@ +{% extends 'subjects/view.html' %} + +{% load static i18n django_bootstrap_breadcrumbs %} + +{% block style %} + {{block.super}} + +{% endblock %} + +{% block javascript %} + {{block.super}} + + +{% endblock %} + +{% block breadcrumbs %} + {{ block.super }} + + {% breadcrumb topic 'subjects:topic_view' topic.subject.slug topic.slug %} + + {% trans 'Add Topic Goals' as bread %} + {% breadcrumb bread 'goals:create' topic.slug %} +{% endblock %} + +{% block content %} +
+
+
+ {% include 'goals/_form.html' %} +
+
+
+
+
+{% endblock %} diff --git a/goals/tests.py b/goals/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/goals/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/goals/urls.py b/goals/urls.py new file mode 100644 index 0000000..67e6698 --- /dev/null +++ b/goals/urls.py @@ -0,0 +1,8 @@ +from django.conf.urls import url +from django.contrib.auth import views as auth_views + +from . import views + +urlpatterns = [ + url(r'^create/(?P[\w_-]+)/$', views.CreateView.as_view(), name = 'create'), +] diff --git a/goals/views.py b/goals/views.py new file mode 100644 index 0000000..1dbe58b --- /dev/null +++ b/goals/views.py @@ -0,0 +1,134 @@ +from django.shortcuts import get_object_or_404, redirect, render +from django.views import generic +from django.contrib import messages +from django.core.urlresolvers import reverse, reverse_lazy +from django.utils.translation import ugettext_lazy as _ +from django.contrib.auth.mixins import LoginRequiredMixin + +from amadeus.permissions import has_subject_permissions, has_resource_permissions + +from topics.models import Topic + +from .forms import GoalsForm, InlinePendenciesFormset, InlineGoalItemFormset +from .models import Goals + +class CreateView(LoginRequiredMixin, generic.edit.CreateView): + login_url = reverse_lazy("users:login") + redirect_field_name = 'next' + + template_name = 'goals/create.html' + form_class = GoalsForm + + def dispatch(self, request, *args, **kwargs): + slug = self.kwargs.get('slug', '') + topic = get_object_or_404(Topic, slug = slug) + + if not has_subject_permissions(request.user, topic.subject): + return redirect(reverse_lazy('subjects:home')) + + return super(CreateView, self).dispatch(request, *args, **kwargs) + + def get(self, request, *args, **kwargs): + self.object = None + + form_class = self.get_form_class() + form = self.get_form(form_class) + + slug = self.kwargs.get('slug', '') + topic = get_object_or_404(Topic, slug = slug) + + pendencies_form = InlinePendenciesFormset(initial = [{'subject': topic.subject.id, 'actions': [("", "-------"),("view", _("Visualize")), ("submit", _("Submit"))]}]) + goalitems_form = InlineGoalItemFormset() + + return self.render_to_response(self.get_context_data(form = form, pendencies_form = pendencies_form, goalitems_form = goalitems_form)) + + def post(self, request, *args, **kwargs): + self.object = None + + form_class = self.get_form_class() + form = self.get_form(form_class) + + slug = self.kwargs.get('slug', '') + topic = get_object_or_404(Topic, slug = slug) + + pendencies_form = InlinePendenciesFormset(self.request.POST, initial = [{'subject': topic.subject.id, 'actions': [("", "-------"),("view", _("Visualize")), ("submit", _("Submit"))]}]) + goalitems_form = InlineGoalItemFormset(self.request.POST) + + if (form.is_valid() and pendencies_form.is_valid() and goalitems_form.is_valid()): + return self.form_valid(form, pendencies_form, goalitems_form) + else: + return self.form_invalid(form, pendencies_form, goalitems_form) + + def get_initial(self): + initial = super(CreateView, self).get_initial() + + slug = self.kwargs.get('slug', '') + + topic = get_object_or_404(Topic, slug = slug) + initial['subject'] = topic.subject + initial['topic'] = topic + + return initial + + def form_invalid(self, form, pendencies_form, goalitems_form): + for p_form in pendencies_form.forms: + p_form.fields['action'].choices = [("", "-------"),("view", _("Visualize")), ("submit", _("Submit"))] + + return self.render_to_response(self.get_context_data(form = form, pendencies_form = pendencies_form, goalitems_form = goalitems_form)) + + def form_valid(self, form, pendencies_form, goalitems_form): + self.object = form.save(commit = False) + + slug = self.kwargs.get('slug', '') + topic = get_object_or_404(Topic, slug = slug) + + self.object.topic = topic + self.object.order = topic.resource_topic.count() + 1 + + self.object.all_students = True + + if not self.object.topic.visible and not self.object.topic.repository: + self.object.visible = False + + self.object.save() + + pendencies_form.instance = self.object + pendencies_form.save(commit = False) + + for pform in pendencies_form.forms: + pend_form = pform.save(commit = False) + + if not pend_form.action == "": + pend_form.save() + + goalitems_form.instance = self.object + goalitems_form.save(commit = False) + + return redirect(self.get_success_url()) + + def get_context_data(self, **kwargs): + context = super(CreateView, self).get_context_data(**kwargs) + + context['title'] = _('Create Topic Goals') + + slug = self.kwargs.get('slug', '') + topic = get_object_or_404(Topic, slug = slug) + + context['topic'] = topic + context['subject'] = topic.subject + + return context + + def get_success_url(self): + messages.success(self.request, _('The topic "%s" Goals specification was realized successfully!')%(self.object.topic.name)) + + #success_url = reverse_lazy('youtube:view', kwargs = {'slug': self.object.slug}) + + #if self.object.show_window: + # self.request.session['resources'] = {} + # self.request.session['resources']['new_page'] = True + # self.request.session['resources']['new_page_url'] = reverse('youtube:window_view', kwargs = {'slug': self.object.slug}) + + success_url = reverse_lazy('subjects:view', kwargs = {'slug': self.object.topic.subject.slug}) + + return success_url \ No newline at end of file diff --git a/mural/migrations/0008_auto_20170224_0023.py b/mural/migrations/0008_auto_20170224_0023.py new file mode 100644 index 0000000..87ed42d --- /dev/null +++ b/mural/migrations/0008_auto_20170224_0023.py @@ -0,0 +1,26 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.10 on 2017-02-24 03:23 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('mural', '0007_comment_edited'), + ] + + operations = [ + migrations.AlterField( + model_name='categorypost', + name='space', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='post_category', to='categories.Category', verbose_name='Category'), + ), + migrations.AlterField( + model_name='subjectpost', + name='resource', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='post_resource', to='topics.Resource', verbose_name='Resource'), + ), + ] diff --git a/pendencies/forms.py b/pendencies/forms.py index eaef78d..141e4e2 100644 --- a/pendencies/forms.py +++ b/pendencies/forms.py @@ -30,15 +30,88 @@ class PendenciesForm(forms.ModelForm): def clean(self): cleaned_data = super(PendenciesForm, self).clean() - print(cleaned_data) + pend_id = cleaned_data.get('id', None) + + action = cleaned_data.get('action', None) + begin_date = cleaned_data.get('begin_date', None) + end_date = cleaned_data.get('end_date', None) + begin_check = cleaned_data.get('begin_date_check', False) + end_check = cleaned_data.get('end_date_check', False) + subject_id = cleaned_data.get('subject', None) + + if begin_check or end_check: + if not action: + self.add_error('action', _('This field is required.')) + + if not begin_date and begin_check: + self.add_error('begin_date', _('This field is required.')) + + if not end_date and end_check: + self.add_error('end_date', _('This field is required.')) + + if begin_date and end_date: + if not begin_date == ValueError and not end_date == ValueError: + if begin_date > end_date: + self.add_error('begin_date', _('This input should be filled with a date equal or before the End Date.')) + self.add_error('end_date', _('This input should be filled with a date equal or after the Begin Date.')) + + if subject_id: + subject = Subject.objects.get(id = subject_id) + + if not begin_date == ValueError and begin_date: + if not self.instance.id and begin_date.date() < datetime.datetime.today().date(): + self.add_error('begin_date', _("This input should be filled with a date equal or after today's date.")) + + if begin_date.date() < subject.init_date: + self.add_error('begin_date', _('This input should be filled with a date equal or after the subject begin date.')) + + if begin_date.date() > subject.end_date: + self.add_error('begin_date', _('This input should be filled with a date equal or after the subject end date.')) + + if not end_date == ValueError and end_date: + if not self.instance.id and end_date.date() < datetime.datetime.today().date(): + self.add_error('end_date', _("This input should be filled with a date equal or after today's date.")) + + if end_date.date() < subject.init_date: + self.add_error('end_date', _('This input should be filled with a date equal or after the subject begin date.')) + + if end_date.date() > subject.end_date: + self.add_error('end_date', _('This input should be filled with a date equal or before the subject end date.')) + + return cleaned_data + +class PendenciesLimitedForm(forms.ModelForm): + subject = forms.CharField(widget = forms.HiddenInput()) + + def __init__(self, *args, **kwargs): + super(PendenciesLimitedForm, self).__init__(*args, **kwargs) + + if kwargs.get('initial', None): + self.fields['action'].choices = kwargs['initial'].get('actions', []) + + begin_date_check = forms.BooleanField(required = False) + end_date_check = forms.BooleanField(required = False) + limit_date_check = forms.BooleanField(required = False) + begin_date = forms.DateTimeField(input_formats = settings.DATETIME_INPUT_FORMATS) + end_date = forms.DateTimeField(input_formats = settings.DATETIME_INPUT_FORMATS) + limit_date = forms.DateTimeField(input_formats = settings.DATETIME_INPUT_FORMATS) + + class Meta: + model = Pendencies + fields = ['action'] + + def clean(self): + cleaned_data = super(PendenciesLimitedForm, self).clean() pend_id = cleaned_data.get('id', None) action = cleaned_data.get('action', None) begin_date = cleaned_data.get('begin_date', None) end_date = cleaned_data.get('end_date', None) + limit_date = cleaned_data.get('limit_date', None) begin_check = cleaned_data.get('begin_date_check', False) end_check = cleaned_data.get('end_date_check', False) + limit_check = cleaned_data.get('limit_date_check', False) subject_id = cleaned_data.get('subject', None) if begin_check or end_check: diff --git a/pendencies/migrations/0006_auto_20170224_0023.py b/pendencies/migrations/0006_auto_20170224_0023.py new file mode 100644 index 0000000..783163f --- /dev/null +++ b/pendencies/migrations/0006_auto_20170224_0023.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.10 on 2017-02-24 03:23 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('pendencies', '0005_auto_20170201_2010'), + ] + + operations = [ + migrations.AlterField( + model_name='pendencies', + name='action', + field=models.CharField(blank=True, choices=[('view', 'Visualize'), ('create', 'Create'), ('answer', 'Answer'), ('access', 'Access'), ('finish', 'Finish'), ('submit', 'Submit')], max_length=100, verbose_name='Action'), + ), + ] diff --git a/pendencies/models.py b/pendencies/models.py index 04e032a..f612d0f 100644 --- a/pendencies/models.py +++ b/pendencies/models.py @@ -5,7 +5,7 @@ from django.utils.translation import ugettext_lazy as _ from topics.models import Resource class Pendencies(models.Model): - action = models.CharField(_('Action'), max_length = 100, choices = (("view", _("Visualize")), ("create", _("Create")), ("answer", _("Answer")), ("access", _("Access")), ("finish", _("Finish"))), blank = True) + action = models.CharField(_('Action'), max_length = 100, choices = (("view", _("Visualize")), ("create", _("Create")), ("answer", _("Answer")), ("access", _("Access")), ("finish", _("Finish")), ("submit", _("Submit"))), blank = True) begin_date = models.DateTimeField(_('Begin Date'), null = True, blank = True) end_date = models.DateTimeField(_('End Date'), null = True, blank = True) limit_date = models.DateTimeField(_('Limit Date'), null = True, blank = True) diff --git a/topics/templates/topics/list.html b/topics/templates/topics/list.html index 672e36d..b45326c 100644 --- a/topics/templates/topics/list.html +++ b/topics/templates/topics/list.html @@ -58,6 +58,7 @@
  • {% trans 'File Link' %}
  • {% trans "Link to Website" %}
  • {% trans 'Webpage' %}
  • +
  • {% trans 'Topic Goals' %}
  • {% trans 'Questionary' %}
  • -- libgit2 0.21.2