Commit ec910cdafc116a9e0f1970349084ebc297e8d21e

Authored by Felipe Henrique de Almeida Bormann
2 parents 1979c41b fd9e9681

fixed conflicts between commits

amadeus/static/css/base/amadeus.css
... ... @@ -2,6 +2,10 @@
2 2 padding: 0px 8px;
3 3 }
4 4  
  5 +.bootstrap-tagsinput {
  6 + width: 100%;
  7 +}
  8 +
5 9 /* Initial page starts */
6 10 .users-cloud {
7 11  
... ...
amadeus/templates/base.html
... ... @@ -50,7 +50,7 @@
50 50  
51 51 <!--Javascript block for specific-app ones -->
52 52 <script src="{% static 'js/base/amadeus.js' %}"></script>
53   - <script src="{% static 'js/main.js' %}"></script>
  53 +
54 54  
55 55 {% block style %}
56 56 {% endblock %}
... ... @@ -216,6 +216,7 @@
216 216  
217 217 <!-- Init material Bootstrap -->
218 218 <script type="text/javascript">$.material.init()</script>
  219 + <script src="{% static 'js/main.js' %}"></script>
219 220 <script type="text/javascript">
220 221 $('.text_wysiwyg').summernote({
221 222 height: 200
... ...
subjects/forms.py
1   -from .models import Subject, Tag
2 1 from django import forms
  2 +from django.utils.translation import ugettext_lazy as _
  3 +
  4 +from .models import Subject, Tag
  5 +
3 6 class CreateSubjectForm(forms.ModelForm):
  7 + def __init__(self, *args, **kwargs):
  8 + super(CreateSubjectForm, self).__init__(*args, **kwargs)
  9 +
  10 + if not kwargs['instance'] is None:
  11 + self.initial['tags'] = ", ".join(self.instance.tags.all().values_list("name", flat = True))
  12 +
4 13 # TODO: Define form fields here
  14 + tags = forms.CharField(label = _('Tags'), required = False)
  15 +
5 16 class Meta:
6 17 model = Subject
7 18  
8   - fields = ('name', 'description_brief', 'description', 'tags', 'init_date', 'end_date', 'visible', 'professor', 'students', )
  19 + fields = ('name', 'description_brief', 'description', 'init_date', 'end_date', 'visible', 'professor',
  20 + 'students', )
  21 +
9 22  
10 23 widgets = {
11 24 'description_brief': forms.Textarea,
... ... @@ -14,6 +27,36 @@ class CreateSubjectForm(forms.ModelForm):
14 27 'students': forms.SelectMultiple,
15 28 }
16 29  
  30 + def save(self, commit=True):
  31 + super(CreateSubjectForm, self).save(commit = True)
  32 +
  33 + self.instance.save()
  34 +
  35 + previous_tags = self.instance.tags.all()
  36 +
  37 + tags = self.cleaned_data['tags'].split(",")
  38 +
  39 + #Excluding unwanted tags
  40 + for prev in previous_tags:
  41 + if not prev.name in tags:
  42 + self.instance.tags.remove(prev)
  43 +
  44 + for tag in tags:
  45 + tag = tag.strip()
  46 +
  47 + exist = Tag.objects.filter(name = tag).exists()
  48 +
  49 + if exist:
  50 + new_tag = Tag.objects.get(name = tag)
  51 + else:
  52 + new_tag = Tag.objects.create(name = tag)
  53 +
  54 + if not new_tag in self.instance.tags.all():
  55 + self.instance.tags.add(new_tag)
  56 +
  57 + #self.instance.save()
  58 +
  59 + return self.instance
17 60  
18 61 class CreateTagForm(forms.ModelForm):
19 62 class Meta:
... ...
subjects/templates/subjects/_form.html 0 → 100644
... ... @@ -0,0 +1,179 @@
  1 +{% load widget_tweaks static i18n %}
  2 +
  3 +<form method="post" action="" enctype="multipart/form-data">
  4 + {% csrf_token %}
  5 + {% for field in form %}
  6 + {% if field.auto_id == 'id_students' %}
  7 + <div class="panel-group" id="coordinators_accordion" role="tablist" aria-multiselectable="true">
  8 + <div class="panel panel-info">
  9 + <div class="panel-heading">
  10 + <div class="row">
  11 + <div class="col-md-12">
  12 + <a data-parent="#coordinators_accordion" data-toggle="collapse" href="#students">
  13 + <h4 class="panel-title">
  14 + <button class="btn btn-default btn-xs text-center cat-selector"><i class="fa fa-angle-right fa-2x" aria-hidden="true"></i></button><label for="{{ field.auto_id }}">{{ field.label }}</label>
  15 + </h4>
  16 + </a>
  17 + </div>
  18 + </div>
  19 + </div>
  20 + <div id="students" class="panel-collapse collapse">
  21 + <p><em>{% trans 'Attribute students to subject' %}:</em></p>
  22 + {% render_field field class='form-control' %}
  23 + </div>
  24 + </div>
  25 + </div>
  26 + {% elif field.auto_id == 'id_professor' %}
  27 + <div class="panel-group" id="professors_accordion" role="tablist" aria-multiselectable="true">
  28 + <div class="panel panel-info">
  29 + <div class="panel-heading">
  30 + <div class="row">
  31 + <div class="col-md-12">
  32 + <a data-parent="#professors_accordion" data-toggle="collapse" href="#professors">
  33 + <h4 class="panel-title">
  34 + <button class="btn btn-default btn-xs text-center cat-selector"><i class="fa fa-angle-right fa-2x" aria-hidden="true"></i></button><label for="{{ field.auto_id }}">{{ field.label }}</label>
  35 + </h4>
  36 + </a>
  37 + </div>
  38 + </div>
  39 + </div>
  40 + <div id="professors" class="panel-collapse collapse">
  41 + <p><em>{% trans 'Attribute professors to subject' %}:</em></p>
  42 + {% render_field field class='form-control' %}
  43 + </div>
  44 + </div>
  45 + </div>
  46 + {% elif field.auto_id == 'id_tags'%}
  47 + <label> {{field.label}} </label>
  48 + {% render_field field class='form-control' data-role="tagsinput" %}
  49 + {% else %}
  50 + <div class="form-group {% if form.has_error %} has-error {% endif %} is-fileinput">
  51 + {% if field.auto_id != 'id_visible' %}
  52 + <label for="{{ field.auto_id }}">{{ field.label }}</label>
  53 + {% endif %}
  54 + {% if field.auto_id == 'id_visible' %}
  55 + <div class="checkbox">
  56 + <label for="{{ field.auto_id }}">
  57 + {% render_field field %} {{field.label}}
  58 + </label>
  59 + </div>
  60 + {% elif field.auto_id == 'id_description' or field.auto_id == 'id_description_brief' %}
  61 + {% render_field field class='form-control text_wysiwyg' %}
  62 + {% elif field.auto_id == 'id_init_date' or field.auto_id == 'id_end_date' %}
  63 + {% render_field field class='form-control date-picker' %}
  64 + {% else %}
  65 + {% render_field field class='form-control' %}
  66 + {% endif %}
  67 + </div>
  68 + {% endif %}
  69 + <span class="help-block">{{ field.help_text }}</span>
  70 + {% if field.errors %}
  71 + <div class="row">
  72 + </br>
  73 + <div class="alert alert-danger alert-dismissible" role="alert">
  74 + <button type="button" class="close" data-dismiss="alert" aria-label="Close">
  75 + <span aria-hidden="true">&times;</span>
  76 + </button>
  77 + <ul>
  78 + {% for error in field.errors %}
  79 + <li>{{ error }}</li>
  80 + {% endfor %}
  81 + </ul>
  82 + </div>
  83 + </div>
  84 + {% endif %}
  85 + {% endfor %}
  86 + <div class="row text-center">
  87 + <input type="submit" value="{% trans 'Save' %}" class="btn btn-primary btn-raised" />
  88 + </div>
  89 +</form>
  90 +
  91 +<script type="text/javascript">
  92 + $('#id_professor').multiSelect({
  93 + selectableHeader: "<input type='text' class='search-input category-search-users' autocomplete='off' placeholder=' '>",
  94 + selectionHeader: "<input type='text' class='search-input category-search-users' autocomplete='off' placeholder=''>",
  95 + afterInit: function(ms){
  96 + var that = this,
  97 + $selectableSearch = that.$selectableUl.prev(),
  98 + $selectionSearch = that.$selectionUl.prev(),
  99 + selectableSearchString = '#'+that.$container.attr('id')+' .ms-elem-selectable:not(.ms-selected)',
  100 + selectionSearchString = '#'+that.$container.attr('id')+' .ms-elem-selection.ms-selected';
  101 +
  102 + that.qs1 = $selectableSearch.quicksearch(selectableSearchString)
  103 + .on('keydown', function(e){
  104 + if (e.which === 40){
  105 + that.$selectableUl.focus();
  106 + return false;
  107 + }
  108 + });
  109 +
  110 + that.qs2 = $selectionSearch.quicksearch(selectionSearchString)
  111 + .on('keydown', function(e){
  112 + if (e.which == 40){
  113 + that.$selectionUl.focus();
  114 + return false;
  115 + }
  116 + });
  117 + },
  118 + afterSelect: function(){
  119 + this.qs1.cache();
  120 + this.qs2.cache();
  121 + },
  122 + afterDeselect: function(){
  123 + this.qs1.cache();
  124 + this.qs2.cache();
  125 + }
  126 + });// Used to create multi-select css style
  127 +
  128 + $('#id_students').multiSelect({
  129 + selectableHeader: "<input type='text' class='search-input category-search-users' autocomplete='off' placeholder=' '>",
  130 + selectionHeader: "<input type='text' class='search-input category-search-users' autocomplete='off' placeholder=''>",
  131 + afterInit: function(ms){
  132 + var that = this,
  133 + $selectableSearch = that.$selectableUl.prev(),
  134 + $selectionSearch = that.$selectionUl.prev(),
  135 + selectableSearchString = '#'+that.$container.attr('id')+' .ms-elem-selectable:not(.ms-selected)',
  136 + selectionSearchString = '#'+that.$container.attr('id')+' .ms-elem-selection.ms-selected';
  137 +
  138 + that.qs1 = $selectableSearch.quicksearch(selectableSearchString)
  139 + .on('keydown', function(e){
  140 + if (e.which === 40){
  141 + that.$selectableUl.focus();
  142 + return false;
  143 + }
  144 + });
  145 +
  146 + that.qs2 = $selectionSearch.quicksearch(selectionSearchString)
  147 + .on('keydown', function(e){
  148 + if (e.which == 40){
  149 + that.$selectionUl.focus();
  150 + return false;
  151 + }
  152 + });
  153 + },
  154 + afterSelect: function(){
  155 + this.qs1.cache();
  156 + this.qs2.cache();
  157 + },
  158 + afterDeselect: function(){
  159 + this.qs1.cache();
  160 + this.qs2.cache();
  161 + }
  162 + });// Used to create multi-select css style
  163 +
  164 + $('.collapse').on('show.bs.collapse', function (e) {
  165 + if($(this).is(e.target)){
  166 + var btn = $(this).parent().find('.fa-angle-right');
  167 +
  168 + btn.switchClass("fa-angle-right", "fa-angle-down", 250, "easeInOutQuad");
  169 + }
  170 + });
  171 +
  172 + $('.collapse').on('hide.bs.collapse', function (e) {
  173 + if($(this).is(e.target)){
  174 + var btn = $(this).parent().find('.fa-angle-down');
  175 +
  176 + btn.switchClass("fa-angle-down", "fa-angle-right", 250, "easeInOutQuad");
  177 + }
  178 + });
  179 +</script>
0 180 \ No newline at end of file
... ...
subjects/templates/subjects/create.html
1 1 {% extends 'categories/home.html' %}
2 2  
3   -{% load widget_tweaks static i18n permission_tags django_bootstrap_breadcrumbs switchevenodd %}
  3 +{% load static i18n django_bootstrap_breadcrumbs switchevenodd %}
4 4  
5 5 {% block style %}
6   -
7 6 {{block.super}}
8 7 <link rel="stylesheet" type="text/css" href="{% static "css/bootstrap-tagsinput.css" %}">
9   -
10   -
11   -{% endblock style %}
  8 +{% endblock %}
12 9  
13 10 {% block javascript %}
14 11 {{block.super}}
15 12 <script type="text/javascript" src="{% static "js/bootstrap-tagsinput.js" %} "></script>
16   -
17   -{% endblock javascript %}
  13 +{% endblock %}
18 14  
19 15 {% block breadcrumbs %}
20 16 {% clear_breadcrumbs %}
... ... @@ -25,190 +21,12 @@
25 21 {% endblock %}
26 22  
27 23 {% block content %}
28   -
29 24 <div class="card card-content">
30 25 <div class="card-body">
31   - <form method="post" action="" enctype="multipart/form-data">
32   - {% csrf_token %}
33   - {% for field in form %}
34   - {% if field.auto_id == 'id_students' %}
35   - <div class="panel-group" id="coordinators_accordion" role="tablist" aria-multiselectable="true">
36   - <div class="panel panel-info">
37   - <div class="panel-heading">
38   - <div class="row">
39   - <div class="col-md-12">
40   - <a data-parent="#coordinators_accordion" data-toggle="collapse" href="#students">
41   - <h4 class="panel-title">
42   - <button class="btn btn-default btn-xs text-center cat-selector"><i class="fa fa-angle-right fa-2x" aria-hidden="true"></i></button><label for="{{ field.auto_id }}">{{ field.label }}</label>
43   - </h4>
44   - </a>
45   - </div>
46   - </div>
47   - </div>
48   - <div id="students" class="panel-collapse collapse">
49   - <p><em>{% trans 'Attribute students to subject' %}:</em></p>
50   - {% render_field field class='form-control' %}
51   - </div>
52   - </div>
53   - </div>
54   - {% elif field.auto_id == 'id_professor' %}
55   - <div class="panel-group" id="professors_accordion" role="tablist" aria-multiselectable="true">
56   - <div class="panel panel-info">
57   - <div class="panel-heading">
58   - <div class="row">
59   - <div class="col-md-12">
60   - <a data-parent="#professors_accordion" data-toggle="collapse" href="#professors">
61   - <h4 class="panel-title">
62   - <button class="btn btn-default btn-xs text-center cat-selector"><i class="fa fa-angle-right fa-2x" aria-hidden="true"></i></button><label for="{{ field.auto_id }}">{{ field.label }}</label>
63   - </h4>
64   - </a>
65   - </div>
66   - </div>
67   - </div>
68   - <div id="professors" class="panel-collapse collapse">
69   - <p><em>{% trans 'Attribute professors to subject' %}:</em></p>
70   - {% render_field field class='form-control' %}
71   - </div>
72   - </div>
73   - </div>
74   - {% elif field.auto_id == 'id_markers'%}
75   - <label> {{field.label}} </label>
76   - {% render_field field class='form-control' data-role="tagsinput" %}
77   - {% else %}
78   - <div class="form-group {% if form.has_error %} has-error {% endif %} is-fileinput">
79   - {% if field.auto_id != 'id_visible' %}
80   - <label for="{{ field.auto_id }}">{{ field.label }}</label>
81   - {% endif %}
82   - {% if field.auto_id == 'id_visible' %}
83   - <div class="checkbox">
84   - <label for="{{ field.auto_id }}">
85   - {% render_field field %} {{field.label}}
86   - </label>
87   - </div>
88   - {% elif field.auto_id == 'id_description' or field.auto_id == 'id_description_brief' %}
89   - {% render_field field class='form-control text_wysiwyg' %}
90   - {% else %}
91   - {% render_field field class='form-control' %}
92   - {% endif %}
93   - <span class="help-block">{{ field.help_text }}</span>
94   - {% if field.errors %}
95   - <div class="row">
96   - </br>
97   - <div class="alert alert-danger alert-dismissible" role="alert">
98   - <button type="button" class="close" data-dismiss="alert" aria-label="Close">
99   - <span aria-hidden="true">&times;</span>
100   - </button>
101   - <ul>
102   - {% for error in field.errors %}
103   - <li>{{ error }}</li>
104   - {% endfor %}
105   - </ul>
106   - </div>
107   - </div>
108   - {% endif %}
109   - </div>
110   - {% endif %}
111   -
112   - {% endfor %}
113   - <div class="row text-center">
114   - <input type="submit" value="{% trans 'Save' %}" class="btn btn-primary btn-raised" />
  26 + {% include 'subjects/_form.html' %}
115 27 </div>
116   - </form>
117   - </div>
118 28 </div>
119 29 <br clear="all" />
120 30 <br clear="all" />
121   -
122   - <script type="text/javascript">
123   - $('#id_professor').multiSelect({
124   - selectableHeader: "<input type='text' class='search-input category-search-users' autocomplete='off' placeholder=' '>",
125   - selectionHeader: "<input type='text' class='search-input category-search-users' autocomplete='off' placeholder=''>",
126   - afterInit: function(ms){
127   - var that = this,
128   - $selectableSearch = that.$selectableUl.prev(),
129   - $selectionSearch = that.$selectionUl.prev(),
130   - selectableSearchString = '#'+that.$container.attr('id')+' .ms-elem-selectable:not(.ms-selected)',
131   - selectionSearchString = '#'+that.$container.attr('id')+' .ms-elem-selection.ms-selected';
132   -
133   - that.qs1 = $selectableSearch.quicksearch(selectableSearchString)
134   - .on('keydown', function(e){
135   - if (e.which === 40){
136   - that.$selectableUl.focus();
137   - return false;
138   - }
139   - });
140   -
141   - that.qs2 = $selectionSearch.quicksearch(selectionSearchString)
142   - .on('keydown', function(e){
143   - if (e.which == 40){
144   - that.$selectionUl.focus();
145   - return false;
146   - }
147   - });
148   - },
149   - afterSelect: function(){
150   - this.qs1.cache();
151   - this.qs2.cache();
152   - },
153   - afterDeselect: function(){
154   - this.qs1.cache();
155   - this.qs2.cache();
156   - }
157   - });// Used to create multi-select css style
158   -
159   - $('#id_students').multiSelect({
160   - selectableHeader: "<input type='text' class='search-input category-search-users' autocomplete='off' placeholder=' '>",
161   - selectionHeader: "<input type='text' class='search-input category-search-users' autocomplete='off' placeholder=''>",
162   - afterInit: function(ms){
163   - var that = this,
164   - $selectableSearch = that.$selectableUl.prev(),
165   - $selectionSearch = that.$selectionUl.prev(),
166   - selectableSearchString = '#'+that.$container.attr('id')+' .ms-elem-selectable:not(.ms-selected)',
167   - selectionSearchString = '#'+that.$container.attr('id')+' .ms-elem-selection.ms-selected';
168   -
169   - that.qs1 = $selectableSearch.quicksearch(selectableSearchString)
170   - .on('keydown', function(e){
171   - if (e.which === 40){
172   - that.$selectableUl.focus();
173   - return false;
174   - }
175   - });
176   -
177   - that.qs2 = $selectionSearch.quicksearch(selectionSearchString)
178   - .on('keydown', function(e){
179   - if (e.which == 40){
180   - that.$selectionUl.focus();
181   - return false;
182   - }
183   - });
184   - },
185   - afterSelect: function(){
186   - this.qs1.cache();
187   - this.qs2.cache();
188   - },
189   - afterDeselect: function(){
190   - this.qs1.cache();
191   - this.qs2.cache();
192   - }
193   - });// Used to create multi-select css style
194   -
195   - $('.collapse').on('show.bs.collapse', function (e) {
196   - if($(this).is(e.target)){
197   - var btn = $(this).parent().find('.fa-angle-right');
198   -
199   - btn.switchClass("fa-angle-right", "fa-angle-down", 250, "easeInOutQuad");
200   - }
201   - });
202   -
203   - $('.collapse').on('hide.bs.collapse', function (e) {
204   - if($(this).is(e.target)){
205   - var btn = $(this).parent().find('.fa-angle-down');
206   -
207   - btn.switchClass("fa-angle-down", "fa-angle-right", 250, "easeInOutQuad");
208   - }
209   - });
210   -
211   -
212   - </script>
213   -{% endblock content %}
  31 +{% endblock %}
214 32  
... ...
subjects/templates/subjects/subject_card.html
1 1 {% load static i18n permission_tags %}
2 2 {% if subject.visible %}
3   -
4   -
5   -
6   -
7   -<script type="text/javascript" src="{% static "subjects/js/subjects_card.js" %} "></script>
8   -
9   -<div class="panel panel-info subject-panel">
10   - <div class="panel-heading">
11   -
12   -
13   -
14   - <div class="row">
15   - <div class="col-md-12 category-header">
16   - <h4 class="panel-title">
17   - <a class="category-course-link pull-left" data-parent="#{% if accordion_id %}{{ accordion_id }}{% else %}{{ subject.category.slug }}-accordion{% endif %}" data-toggle="collapse" href="#{{subject.slug}}">
18   - <button class="btn btn-default btn-xs text-center cat-selector"><i class="fa fa-angle-right fa-2x" aria-hidden="true"></i></button> {{subject.name}}
19   - </a>
20   - </h4>
21   -
22   - <div class="col-md-5 pull-right category-card-items">
23   - {% if request.user in subject.professor.all or request.user in category.coordinators.all or request.user.is_staff %}
24   - <a href="" id="moreActions" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
25   - <i class="fa fa-ellipsis-v" aria-hidden="true"></i>
  3 + <div class="panel panel-info subject-panel">
  4 + <div class="panel-heading">
  5 + <div class="row">
  6 + <div class="col-md-12 category-header">
  7 + <h4 class="panel-title">
  8 + <a class="category-course-link pull-left" data-parent="#{% if accordion_id %}{{ accordion_id }}{% else %}{{ subject.category.slug }}-accordion{% endif %}" data-toggle="collapse" href="#{{subject.slug}}">
  9 + <button class="btn btn-default btn-xs text-center cat-selector"><i class="fa fa-angle-right fa-2x" aria-hidden="true"></i></button> {{subject.name}}
26 10 </a>
27   - <ul class="dropdown-menu pull-right" aria-labelledby="moreActions">
28   - <li><a href="{% url 'subjects:replicate' subject.slug %}"><i class="fa fa-files-o fa-fw" aria-hidden="true"></i>{% trans 'Replicate' %}</a></li>
29   - <li><a href="{% url 'subjects:update' subject.slug %}"><i class="fa fa-pencil fa-fw" aria-hidden="true"></i>{% trans 'Edit' %}</a></li>
30   - <li><a href="javascript:delete_subject.get('{% url 'subjects:delete' subject.slug %}','#subject','#modal_subject')"><i class="fa fa-trash fa-fw" aria-hidden="true"></i>&nbsp;{% trans 'Remove' %}</a></li>
31   - </ul>
32   - {% endif %}
33   - <a href="" ><i class="fa fa-list" aria-hidden="true"></i></a>
34   - <a href=""><i class="fa fa-envelope-o" aria-hidden="true"></i></a>
35   - <a href=""><i class="fa fa-exclamation-triangle" aria-hidden="true"></i></a>
36   - <a href=""><i class="fa fa-bar-chart" aria-hidden="true"></i></a>
37   - </div>
38   - </div>
39   - </div>
40   - </div>
41   - <div id="{{subject.slug}}" class="panel-collapse collapse category-panel-content">
42   - <div class="row">
43   - <div class="col-md-6">
44   - {% if subject.professor.all|length > 0 %}
45   - <h4><b>{% trans "Professors(s) " %}: </b>
46   - {{ subject.professor.all|join:', ' }}
47 11 </h4>
48   - {% else %}
49   - <h4> {% trans "It doesn't possess professors" %} </h4>
50   - {% endif %}
51   - </div>
52   - <div class="col-xs-6 col-md-3">
53   - <p><b>{% trans "Beginning" %}:</b> {{subject.init_date}}</p>
54   - </div>
55   - <div class="col-xs-6 col-md-3">
56   - <p><b>{% trans "End" %}:</b> {{subject.end_date}}</p>
  12 +
  13 + <div class="col-md-5 pull-right category-card-items">
  14 + {% if request.user in subject.professor.all or request.user in category.coordinators.all or request.user.is_staff %}
  15 + <a href="" id="moreActions" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
  16 + <i class="fa fa-ellipsis-v" aria-hidden="true"></i>
  17 + </a>
  18 + <ul class="dropdown-menu pull-right" aria-labelledby="moreActions">
  19 + <li><a href="{% url 'subjects:replicate' subject.slug %}"><i class="fa fa-files-o fa-fw" aria-hidden="true"></i>{% trans 'Replicate' %}</a></li>
  20 + <li><a href="{% url 'subjects:update' subject.slug %}"><i class="fa fa-pencil fa-fw" aria-hidden="true"></i>{% trans 'Edit' %}</a></li>
  21 + <li><a href="javascript:delete_subject.get('{% url 'subjects:delete' subject.slug %}','#subject','#modal_subject')"><i class="fa fa-trash fa-fw" aria-hidden="true"></i>&nbsp;{% trans 'Remove' %}</a></li>
  22 + </ul>
  23 + {% endif %}
  24 + <a href="" ><i class="fa fa-list" aria-hidden="true"></i></a>
  25 + <a href=""><i class="fa fa-envelope-o" aria-hidden="true"></i></a>
  26 + <a href=""><i class="fa fa-exclamation-triangle" aria-hidden="true"></i></a>
  27 + <a href=""><i class="fa fa-bar-chart" aria-hidden="true"></i></a>
  28 + </div>
  29 + </div>
57 30 </div>
58 31 </div>
59   -
60   - <p>{{subject.description_brief|safe}}</p>
61   -
62   - {% if request.user in subject.students.all or request.user in subject.professor.all or request.user.is_staff or request.user in category.coordinators.all %}
63   - <a href="#"><button class="access-subject"> {% trans "Access Subject" %}</button></a>
64   - {% else %}
65   - <a href=""><button class="subscribe-subject"> {% trans "Subscribe to Subject" %}</button></a>
66   - {% endif %}
67   - </div>
68   -</div>
69   - {% elif request.user in subject.professor.all or request.user in category.coordinators.all %}
70   -<div class="panel panel-info subject-panel-invisible">
71   - <div class="panel-heading panel-invisible">
72   -
73   -
74   -
75   - <div class="row">
76   - <div class="col-md-12 category-header">
77   - <h4 class="panel-title">
78   - <a class="category-course-link pull-left" data-parent="#{% if accordion_id %}{{ accordion_id }}{% else %}{{ subject.category.slug }}-accordion{% endif %}" data-toggle="collapse" href="#{{subject.slug}}">
79   - <button class="btn btn-default btn-xs text-center cat-selector"><i class="fa fa-angle-right fa-2x" aria-hidden="true"></i></button> {{subject.name}}
80   - </a>
81   - </h4>
82   -
83   - <div class="col-md-5 pull-right category-card-items">
84   - {% if request.user in subject.professor.all or request.user in category.coordinators.all or request.user.is_staff %}
85   - <a href="" id="moreActions" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
86   - <i class="fa fa-ellipsis-v" aria-hidden="true"></i>
87   - </a>
88   - <ul class="dropdown-menu pull-right" aria-labelledby="moreActions">
89   - <li><a href="{% url 'subjects:replicate' subject.slug %}"><i class="fa fa-files-o fa-fw" aria-hidden="true"></i>{% trans 'Replicate' %}</a></li>
90   - <li><a href="{% url 'subjects:update' subject.slug %}"><i class="fa fa-pencil fa-fw" aria-hidden="true"></i>{% trans 'Edit' %}</a></li>
91   - <li><a href="#"><i class="fa fa-trash fa-fw" aria-hidden="true"></i>&nbsp;{% trans 'Remove' %}</a></li>
92   - </ul>
  32 + <div id="{{subject.slug}}" class="panel-collapse collapse category-panel-content">
  33 + <div class="row">
  34 + <div class="col-md-6">
  35 + {% if subject.professor.all|length > 0 %}
  36 + <h4><b>{% trans "Professors(s) " %}: </b>
  37 + {{ subject.professor.all|join:', ' }}
  38 + </h4>
  39 + {% else %}
  40 + <h4> {% trans "It doesn't possess professors" %} </h4>
93 41 {% endif %}
94   - <a href="" ><i class="fa fa-list" aria-hidden="true"></i></a>
95   - <a href=""><i class="fa fa-envelope-o" aria-hidden="true"></i></a>
96   - <a href=""><i class="fa fa-exclamation-triangle" aria-hidden="true"></i></a>
97   - <a href=""><i class="fa fa-bar-chart" aria-hidden="true"></i></a>
  42 + </div>
  43 + <div class="col-xs-6 col-md-3">
  44 + <p><b>{% trans "Beginning" %}:</b> {{subject.init_date}}</p>
  45 + </div>
  46 + <div class="col-xs-6 col-md-3">
  47 + <p><b>{% trans "End" %}:</b> {{subject.end_date}}</p>
98 48 </div>
99 49 </div>
  50 +
  51 + <p>{{subject.description_brief|safe}}</p>
  52 +
  53 + {% if request.user in subject.students.all or request.user in subject.professor.all or request.user.is_staff or request.user in category.coordinators.all %}
  54 + <a href="#"><button class="access-subject"> {% trans "Access Subject" %}</button></a>
  55 + {% else %}
  56 + <a href="#"><button class="subscribe-subject"> {% trans "Subscribe to Subject" %}</button></a>
  57 + {% endif %}
100 58 </div>
101 59 </div>
102   - <div id="{{subject.slug}}" class="panel-collapse collapse category-panel-content">
103   - <div class="row">
104   - <div class="col-md-6">
105   - {% if subject.professor.all|length > 0 %}
106   - <h4><b>{% trans "Professors(s) " %}: </b>
107   - {{ subject.professor.all|join:', ' }}
  60 +{% elif request.user in subject.professor.all or request.user in category.coordinators.all %}
  61 + <div class="panel panel-info subject-panel-invisible">
  62 + <div class="panel-heading panel-invisible">
  63 + <div class="row">
  64 + <div class="col-md-12 category-header">
  65 + <h4 class="panel-title">
  66 + <a class="category-course-link pull-left" data-parent="#{% if accordion_id %}{{ accordion_id }}{% else %}{{ subject.category.slug }}-accordion{% endif %}" data-toggle="collapse" href="#{{subject.slug}}">
  67 + <button class="btn btn-default btn-xs text-center cat-selector"><i class="fa fa-angle-right fa-2x" aria-hidden="true"></i></button> {{subject.name}}
  68 + </a>
108 69 </h4>
109   - {% else %}
110   - <h4> {% trans "It doesn't possess professors" %} </h4>
111   - {% endif %}
112   - </div>
113   - <div class="col-xs-6 col-md-3">
114   - <p><b>{% trans "Beginning" %}:</b> {{subject.init_date}}</p>
115   - </div>
116   - <div class="col-xs-6 col-md-3">
117   - <p><b>{% trans "End" %}:</b> {{subject.end_date}}</p>
  70 +
  71 + <div class="col-md-5 pull-right category-card-items">
  72 + {% if request.user in subject.professor.all or request.user in category.coordinators.all or request.user.is_staff %}
  73 + <a href="" id="moreActions" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
  74 + <i class="fa fa-ellipsis-v" aria-hidden="true"></i>
  75 + </a>
  76 + <ul class="dropdown-menu pull-right" aria-labelledby="moreActions">
  77 + <li><a href="{% url 'subjects:replicate' subject.slug %}"><i class="fa fa-files-o fa-fw" aria-hidden="true"></i>{% trans 'Replicate' %}</a></li>
  78 + <li><a href="{% url 'subjects:update' subject.slug %}"><i class="fa fa-pencil fa-fw" aria-hidden="true"></i>{% trans 'Edit' %}</a></li>
  79 + <li><a href="javascript:delete_subject.get('{% url 'subjects:delete' subject.slug %}','#subject','#modal_subject')"><i class="fa fa-trash fa-fw" aria-hidden="true"></i>&nbsp;{% trans 'Remove' %}</a></li>
  80 + </ul>
  81 + {% endif %}
  82 + <a href="" ><i class="fa fa-list" aria-hidden="true"></i></a>
  83 + <a href=""><i class="fa fa-envelope-o" aria-hidden="true"></i></a>
  84 + <a href=""><i class="fa fa-exclamation-triangle" aria-hidden="true"></i></a>
  85 + <a href=""><i class="fa fa-bar-chart" aria-hidden="true"></i></a>
  86 + </div>
  87 + </div>
118 88 </div>
119 89 </div>
  90 + <div id="{{subject.slug}}" class="panel-collapse collapse category-panel-content">
  91 + <div class="row">
  92 + <div class="col-md-6">
  93 + {% if subject.professor.all|length > 0 %}
  94 + <h4><b>{% trans "Professors(s) " %}: </b>
  95 + {{ subject.professor.all|join:', ' }}
  96 + </h4>
  97 + {% else %}
  98 + <h4> {% trans "It doesn't possess professors" %} </h4>
  99 + {% endif %}
  100 + </div>
  101 + <div class="col-xs-6 col-md-3">
  102 + <p><b>{% trans "Beginning" %}:</b> {{subject.init_date}}</p>
  103 + </div>
  104 + <div class="col-xs-6 col-md-3">
  105 + <p><b>{% trans "End" %}:</b> {{subject.end_date}}</p>
  106 + </div>
  107 + </div>
120 108  
121   - <p>{{subject.description_brief|safe}}</p>
122   -
123   - {% if request.user in subject.students.all or request.user in subject.professor.all or request.user.is_staff or request.user in category.coordinators.all %}
124   - <a href="#"><button class="access-subject"> {% trans "Access Subject" %}</button></a>
125   - {% else %}
126   - <a href="#"><button class="subscribe-subject"> {% trans "Subscribe to Subject" %}</button></a>
127   - {% endif %}
  109 + <p>{{subject.description_brief|safe}}</p>
  110 +
  111 + {% if request.user in subject.students.all or request.user in subject.professor.all or request.user.is_staff or request.user in category.coordinators.all %}
  112 + <a href="#"><button class="access-subject"> {% trans "Access Subject" %}</button></a>
  113 + {% else %}
  114 + <a href="#"><button class="subscribe-subject"> {% trans "Subscribe to Subject" %}</button></a>
  115 + {% endif %}
  116 + </div>
128 117 </div>
129   -</div>
130 118 {% endif %}
131 119 \ No newline at end of file
... ...
subjects/templates/subjects/update.html
1   -{% extends template_extends %}
  1 +{% extends 'categories/home.html' %}
2 2  
3 3 {% load static i18n %}
4 4 {% load widget_tweaks django_bootstrap_breadcrumbs %}
5 5  
  6 +{% block style %}
  7 + {{block.super}}
  8 + <link rel="stylesheet" type="text/css" href="{% static "css/bootstrap-tagsinput.css" %}">
  9 +{% endblock %}
  10 +
  11 +{% block javascript %}
  12 + {{block.super}}
  13 + <script type="text/javascript" src="{% static "js/bootstrap-tagsinput.js" %} "></script>
  14 +{% endblock %}
  15 +
6 16 {% block breadcrumbs %}
7 17 {{ block.super }}
8 18 {% with 'Update '|add:object.slug as bread_slug %}
9 19 {% breadcrumb bread_slug 'subjects:update' %}
10 20 {% endwith %}
11   -{% endblock breadcrumbs %}
  21 +{% endblock %}
12 22  
13 23 {% block content %}
14 24 <div class="card card-content">
15 25 <div class="card-body">
16   - <form method="post" action="" enctype="multipart/form-data">
17   - {% csrf_token %}
18   - {% for field in form %}
19   - {% if field.auto_id == 'id_students' %}
20   - <div class="panel-group" id="coordinators_accordion" role="tablist" aria-multiselectable="true">
21   - <div class="panel panel-info">
22   - <div class="panel-heading">
23   - <div class="row">
24   - <div class="col-md-12">
25   - <a data-parent="#coordinators_accordion" data-toggle="collapse" href="#students">
26   - <h4 class="panel-title">
27   - <button class="btn btn-default btn-xs text-center cat-selector"><i class="fa fa-angle-right fa-2x" aria-hidden="true"></i></button><label for="{{ field.auto_id }}">{{ field.label }}</label>
28   - </h4>
29   - </a>
30   - </div>
31   - </div>
32   - </div>
33   - <div id="students" class="panel-collapse collapse">
34   - <p><em>{% trans 'Attribute students to subject' %}:</em></p>
35   - {% render_field field class='form-control' %}
36   - </div>
37   - </div>
38   - </div>
39   - {% elif field.auto_id == 'id_professor' %}
40   - <div class="panel-group" id="professors_accordion" role="tablist" aria-multiselectable="true">
41   - <div class="panel panel-info">
42   - <div class="panel-heading">
43   - <div class="row">
44   - <div class="col-md-12">
45   - <a data-parent="#professors_accordion" data-toggle="collapse" href="#professors">
46   - <h4 class="panel-title">
47   - <button class="btn btn-default btn-xs text-center cat-selector"><i class="fa fa-angle-right fa-2x" aria-hidden="true"></i></button><label for="{{ field.auto_id }}">{{ field.label }}</label>
48   - </h4>
49   - </a>
50   - </div>
51   - </div>
52   - </div>
53   - <div id="professors" class="panel-collapse collapse">
54   - <p><em>{% trans 'Attribute professors to subject' %}:</em></p>
55   - {% render_field field class='form-control' %}
56   - </div>
57   - </div>
58   - </div>
59   - {% elif field.auto_id == 'id_markers'%}
60   - <label> {{field.label}} </label>
61   - {% render_field field class='form-control' data-role="tagsinput" %}
62   - {% else %}
63   - <div class="form-group {% if form.has_error %} has-error {% endif %} is-fileinput">
64   - {% if field.auto_id != 'id_visible' %}
65   - <label for="{{ field.auto_id }}">{{ field.label }}</label>
66   - {% endif %}
67   - {% if field.auto_id == 'id_visible' %}
68   - <div class="checkbox">
69   - <label for="{{ field.auto_id }}">
70   - {% render_field field %} {{field.label}}
71   - </label>
72   - </div>
73   - {% elif field.auto_id == 'id_description' or field.auto_id == 'id_description_brief' %}
74   - {% render_field field class='form-control text_wysiwyg' %}
75   - {% else %}
76   - {% render_field field class='form-control' %}
77   - {% endif %}
78   - <span class="help-block">{{ field.help_text }}</span>
79   - {% if field.errors %}
80   - <div class="row">
81   - </br>
82   - <div class="alert alert-danger alert-dismissible" role="alert">
83   - <button type="button" class="close" data-dismiss="alert" aria-label="Close">
84   - <span aria-hidden="true">&times;</span>
85   - </button>
86   - <ul>
87   - {% for error in field.errors %}
88   - <li>{{ error }}</li>
89   - {% endfor %}
90   - </ul>
91   - </div>
92   - </div>
93   - {% endif %}
94   - </div>
95   - {% endif %}
96   -
97   - {% endfor %}
98   - <div class="row text-center">
99   - <input type="submit" value="{% trans 'Save' %}" class="btn btn-primary btn-raised" />
  26 + {% include 'subjects/_form.html' %}
100 27 </div>
101   - </form>
102   - </div>
103 28 </div>
104 29 <br clear="all" />
105 30 <br clear="all" />
106   -
107 31 {% endblock %}
108 32 \ No newline at end of file
... ...
subjects/views.py
... ... @@ -138,8 +138,6 @@ class SubjectCreateView(CreateView):
138 138 initial['end_date'] = subject.end_date
139 139 initial['students'] = subject.students.all()
140 140 initial['description_brief'] = subject.description_brief
141   -
142   -
143 141  
144 142 return initial
145 143  
... ... @@ -163,41 +161,42 @@ class SubjectCreateView(CreateView):
163 161 if self.kwargs.get('subject_slug'):
164 162 subject = get_object_or_404(Subject, slug = self.kwargs['subject_slug'])
165 163 self.object.category = subject.category
166   - self.object.save()
167   -
  164 + self.object.save()
168 165  
169 166 return super(SubjectCreateView, self).form_valid(form)
170 167  
171 168 def get_success_url(self):
  169 +
172 170 if not self.object.category.visible:
173 171 self.object.visible = False
174 172 self.object.save()
175 173  
  174 +
176 175 messages.success(self.request, _('Subject "%s" was registered on "%s" successfully!')%(self.object.name, self.object.category.name ))
177 176 return reverse_lazy('subjects:index')
178 177  
179   -
180   -
181   -
182 178 class SubjectUpdateView(LogMixin, UpdateView):
183   -
184 179 model = Subject
185 180 form_class = CreateSubjectForm
186 181 template_name = 'subjects/update.html'
187 182  
188 183 login_url = reverse_lazy("users:login")
189 184 redirect_field_name = 'next'
  185 +
190 186 def get_context_data(self, **kwargs):
191 187 context = super(SubjectUpdateView, self).get_context_data(**kwargs)
192 188 context['title'] = _('Update Subject')
193   - context['template_extends'] = 'base.html'
  189 + context['template_extends'] = 'categories/home.html'
194 190 context['subjects_menu_active'] = 'subjects_menu_active'
  191 +
195 192 return context
196 193  
197 194 def get_success_url(self):
  195 +
198 196 if not self.object.category.visible:
199 197 self.object.visible = False
200 198 self.object.save()
  199 +
201 200  
202 201 messages.success(self.request, _('Subject "%s" was updated on "%s" successfully!')%(self.object.name, self.object.category.name ))
203 202 return reverse_lazy('subjects:index')
... ...