Commit dee54f993fd636e4ac1f21463620b758e97a3f94
Exists in
master
and in
3 other branches
Merge branch 'refactoring' of https://github.com/amadeusproject/amadeuslms into refactoring
Showing
5 changed files
with
154 additions
and
113 deletions
Show diff stats
amadeus/static/css/base/amadeus.css
| ... | ... | @@ -126,6 +126,19 @@ |
| 126 | 126 | margin-bottom: 15px; |
| 127 | 127 | } |
| 128 | 128 | |
| 129 | +.ms-container { | |
| 130 | + width: 100% !important; | |
| 131 | +} | |
| 132 | + | |
| 133 | +#coordinators_accordion .panel-heading { | |
| 134 | + background: #FFFFFF; | |
| 135 | + border: none; | |
| 136 | +} | |
| 137 | + | |
| 138 | +#coordinators_accordion .panel-collapse { | |
| 139 | + padding: 10px; | |
| 140 | +} | |
| 141 | + | |
| 129 | 142 | /* category app ends */ |
| 130 | 143 | |
| 131 | 144 | .clearfix{ | ... | ... |
540 Bytes
| ... | ... | @@ -0,0 +1,118 @@ |
| 1 | +{% load widget_tweaks static i18n switchevenodd %} | |
| 2 | + | |
| 3 | +<form method="post" action="" enctype="multipart/form-data"> | |
| 4 | + {% csrf_token %} | |
| 5 | + {% for field in form %} | |
| 6 | + {% if field.auto_id == 'id_coordinators' %} | |
| 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="#coords"> | |
| 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="coords" class="panel-collapse collapse"> | |
| 21 | + <p><em>{% trans 'Atribute coordinators role to users' %}:</em></p> | |
| 22 | + {% render_field field class='form-control' %} | |
| 23 | + </div> | |
| 24 | + </div> | |
| 25 | + </div> | |
| 26 | + {% else %} | |
| 27 | + <div class="form-group {% if form.has_error %} has-error {% endif %} is-fileinput"> | |
| 28 | + {% if field.auto_id != 'id_visible' %} | |
| 29 | + <label for="{{ field.auto_id }}">{{ field.label }}</label> | |
| 30 | + {% endif %} | |
| 31 | + {% if field.auto_id == 'id_visible' %} | |
| 32 | + <div class="checkbox"> | |
| 33 | + <label for="{{ field.auto_id }}"> | |
| 34 | + {% render_field field %} {{field.label}} | |
| 35 | + </label> | |
| 36 | + </div> | |
| 37 | + {% elif field.auto_id == 'id_description' %} | |
| 38 | + {% render_field field class='form-control text_wysiwyg' %} | |
| 39 | + {% else %} | |
| 40 | + {% render_field field class='form-control' %} | |
| 41 | + {% endif %} | |
| 42 | + <span class="help-block">{{ field.help_text }}</span> | |
| 43 | + {% if field.errors %} | |
| 44 | + <div class="row"> | |
| 45 | + </br> | |
| 46 | + <div class="alert alert-danger alert-dismissible" role="alert"> | |
| 47 | + <button type="button" class="close" data-dismiss="alert" aria-label="Close"> | |
| 48 | + <span aria-hidden="true">×</span> | |
| 49 | + </button> | |
| 50 | + <ul> | |
| 51 | + {% for error in field.errors %} | |
| 52 | + <li>{{ error }}</li> | |
| 53 | + {% endfor %} | |
| 54 | + </ul> | |
| 55 | + </div> | |
| 56 | + </div> | |
| 57 | + {% endif %} | |
| 58 | + </div> | |
| 59 | + {% endif %} | |
| 60 | + {% endfor %} | |
| 61 | + <div class="row text-center"> | |
| 62 | + <input type="submit" value="{% trans 'Register' %}" class="btn btn-primary btn-raised" /> | |
| 63 | + </div> | |
| 64 | +</form> | |
| 65 | + | |
| 66 | +<script type="text/javascript"> | |
| 67 | + $('#id_coordinators').multiSelect({ | |
| 68 | + selectableHeader: "<input type='text' class='form-control search-input category-search-users' autocomplete='off' placeholder='{% trans "try an username" %} '>", | |
| 69 | + selectionHeader: "<input type='text' class='form-control search-input category-search-users' autocomplete='off' placeholder='{% trans "try an username" %} '>", | |
| 70 | + afterInit: function(ms){ | |
| 71 | + var that = this, | |
| 72 | + $selectableSearch = that.$selectableUl.prev(), | |
| 73 | + $selectionSearch = that.$selectionUl.prev(), | |
| 74 | + selectableSearchString = '#'+that.$container.attr('id')+' .ms-elem-selectable:not(.ms-selected)', | |
| 75 | + selectionSearchString = '#'+that.$container.attr('id')+' .ms-elem-selection.ms-selected'; | |
| 76 | + | |
| 77 | + that.qs1 = $selectableSearch.quicksearch(selectableSearchString) | |
| 78 | + .on('keydown', function(e){ | |
| 79 | + if (e.which === 40){ | |
| 80 | + that.$selectableUl.focus(); | |
| 81 | + return false; | |
| 82 | + } | |
| 83 | + }); | |
| 84 | + | |
| 85 | + that.qs2 = $selectionSearch.quicksearch(selectionSearchString) | |
| 86 | + .on('keydown', function(e){ | |
| 87 | + if (e.which == 40){ | |
| 88 | + that.$selectionUl.focus(); | |
| 89 | + return false; | |
| 90 | + } | |
| 91 | + }); | |
| 92 | + }, | |
| 93 | + afterSelect: function(){ | |
| 94 | + this.qs1.cache(); | |
| 95 | + this.qs2.cache(); | |
| 96 | + }, | |
| 97 | + afterDeselect: function(){ | |
| 98 | + this.qs1.cache(); | |
| 99 | + this.qs2.cache(); | |
| 100 | + } | |
| 101 | + });// Used to create multi-select css style | |
| 102 | + | |
| 103 | + $('.collapse').on('show.bs.collapse', function (e) { | |
| 104 | + if($(this).is(e.target)){ | |
| 105 | + var btn = $(this).parent().find('.fa-angle-right'); | |
| 106 | + | |
| 107 | + btn.switchClass("fa-angle-right", "fa-angle-down", 250, "easeInOutQuad"); | |
| 108 | + } | |
| 109 | + }); | |
| 110 | + | |
| 111 | + $('.collapse').on('hide.bs.collapse', function (e) { | |
| 112 | + if($(this).is(e.target)){ | |
| 113 | + var btn = $(this).parent().find('.fa-angle-down'); | |
| 114 | + | |
| 115 | + btn.switchClass("fa-angle-down", "fa-angle-right", 250, "easeInOutQuad"); | |
| 116 | + } | |
| 117 | + }); | |
| 118 | +</script> | |
| 0 | 119 | \ No newline at end of file | ... | ... |
categories/templates/categories/create.html
| 1 | -{% extends 'categories/home.html' %} | |
| 1 | +{% extends 'categories/list.html' %} | |
| 2 | 2 | |
| 3 | 3 | {% load widget_tweaks static i18n permission_tags django_bootstrap_breadcrumbs switchevenodd %} |
| 4 | 4 | |
| 5 | 5 | {% block breadcrumbs %} |
| 6 | - {{ block.super }} | |
| 7 | - {% breadcrumb 'Create Category' 'categories:create' %} | |
| 6 | + {{ block.super }} | |
| 7 | + {% breadcrumb 'Create Category' 'categories:create' %} | |
| 8 | 8 | {% endblock %} |
| 9 | 9 | |
| 10 | 10 | {% block content %} |
| 11 | -<div class="card card-content"> | |
| 12 | - <div class="card-body"> | |
| 13 | - <form method="post" action="" enctype="multipart/form-data"> | |
| 14 | - {% csrf_token %} | |
| 15 | - {% for field in form %} | |
| 16 | - <div class="form-group {% if form.has_error %} has-error {% endif %} is-fileinput"> | |
| 17 | - {% if field.auto_id != 'id_visible' %} | |
| 18 | - <label for="{{ field.auto_id }}">{{ field.label }}</label> | |
| 19 | - {% endif %} | |
| 20 | - {% if field.auto_id == 'id_init_register_date' or field.auto_id == 'id_end_register_date' or field.auto_id == 'id_init_date' or field.auto_id == 'id_end_date'%} | |
| 21 | - <input type="text" class="form-control date-picker" name="{{field.name}}" value="{{field.value|date}}" min="{{now|date:'SHORT_DATE_FORMAT'}}"> | |
| 22 | - {% elif field.auto_id == 'id_visible' %} | |
| 23 | - <div class="checkbox"> | |
| 24 | - <label for="{{ field.auto_id }}"> | |
| 25 | - {% render_field field %} {{field.label}} | |
| 26 | - </label> | |
| 27 | - </div> | |
| 28 | - {% elif field.auto_id == 'id_description' %} | |
| 29 | - {% render_field field class='form-control text_wysiwyg' %} | |
| 30 | - | |
| 31 | - | |
| 32 | - {% comment %} | |
| 33 | - | |
| 34 | - {% endcomment %} | |
| 35 | - {% elif field.auto_id == 'id_coordinators' %} | |
| 36 | - <select id="{{field.auto_id}}" multiple="multiple" class="form-control" | |
| 37 | - style="position: absolute; left: -9999px;" name="coordinators"> | |
| 38 | - | |
| 39 | - {% for value, name in form.fields.coordinators.choices %} | |
| 40 | - <option value="{{value}}">{{name}}</option> | |
| 41 | - {% endfor %} | |
| 42 | - </select> | |
| 43 | - | |
| 44 | - {% else %} | |
| 45 | - {% render_field field class='form-control' %} | |
| 46 | - {% endif %} | |
| 47 | - <span class="help-block">{{ field.help_text }}</span> | |
| 48 | - {% if field.errors %} | |
| 49 | - <div class="row"> | |
| 50 | - </br> | |
| 51 | - <div class="alert alert-danger alert-dismissible" role="alert"> | |
| 52 | - <button type="button" class="close" data-dismiss="alert" aria-label="Close"> | |
| 53 | - <span aria-hidden="true">×</span> | |
| 54 | - </button> | |
| 55 | - <ul> | |
| 56 | - {% for error in field.errors %} | |
| 57 | - <li>{{ error }}</li> | |
| 58 | - {% endfor %} | |
| 59 | - </ul> | |
| 60 | - </div> | |
| 61 | - </div> | |
| 62 | - {% endif %} | |
| 63 | - </div> | |
| 64 | - {% endfor %} | |
| 65 | - <div class="row text-center"> | |
| 66 | - <input type="submit" value="{% trans 'Register' %}" class="btn btn-primary btn-raised" /> | |
| 67 | - </div> | |
| 68 | - </form> | |
| 11 | + <div class="card card-content"> | |
| 12 | + <div class="card-body"> | |
| 13 | + {% include 'categories/_form.html' %} | |
| 14 | + </div> | |
| 69 | 15 | </div> |
| 70 | -</div> | |
| 71 | -</br> | |
| 72 | -</br> | |
| 73 | -</br> | |
| 74 | -<script type="text/javascript"> | |
| 75 | - var locale = navigator.language || navigator.userLanguage; | |
| 76 | - $('.date-picker').datepicker({ | |
| 77 | - language: locale, | |
| 78 | - }); | |
| 79 | - | |
| 80 | - $('#id_coordinators').multiSelect({ | |
| 81 | - selectableHeader: "<input type='text' class='search-input category-search-users' autocomplete='off' placeholder='{% trans "try an username" %} '>", | |
| 82 | - selectionHeader: "<input type='text' class='search-input category-search-users' autocomplete='off' placeholder='{% trans "try an username" %} '>", | |
| 83 | - afterInit: function(ms){ | |
| 84 | - var that = this, | |
| 85 | - $selectableSearch = that.$selectableUl.prev(), | |
| 86 | - $selectionSearch = that.$selectionUl.prev(), | |
| 87 | - selectableSearchString = '#'+that.$container.attr('id')+' .ms-elem-selectable:not(.ms-selected)', | |
| 88 | - selectionSearchString = '#'+that.$container.attr('id')+' .ms-elem-selection.ms-selected'; | |
| 89 | - | |
| 90 | - that.qs1 = $selectableSearch.quicksearch(selectableSearchString) | |
| 91 | - .on('keydown', function(e){ | |
| 92 | - if (e.which === 40){ | |
| 93 | - that.$selectableUl.focus(); | |
| 94 | - return false; | |
| 95 | - } | |
| 96 | - }); | |
| 97 | - | |
| 98 | - that.qs2 = $selectionSearch.quicksearch(selectionSearchString) | |
| 99 | - .on('keydown', function(e){ | |
| 100 | - if (e.which == 40){ | |
| 101 | - that.$selectionUl.focus(); | |
| 102 | - return false; | |
| 103 | - } | |
| 104 | - }); | |
| 105 | - }, | |
| 106 | - afterSelect: function(){ | |
| 107 | - this.qs1.cache(); | |
| 108 | - this.qs2.cache(); | |
| 109 | - }, | |
| 110 | - afterDeselect: function(){ | |
| 111 | - this.qs1.cache(); | |
| 112 | - this.qs2.cache(); | |
| 113 | - } | |
| 114 | - });// Used to create multi-select css style | |
| 115 | -</script> | |
| 16 | + <br clear="all"> | |
| 17 | + <br clear="all"> | |
| 116 | 18 | {% endblock %} |
| 117 | 19 | \ No newline at end of file | ... | ... |
categories/views.py
| ... | ... | @@ -32,7 +32,6 @@ class IndexView(views.SuperuserRequiredMixin, LoginRequiredMixin, ListView): |
| 32 | 32 | template_name = 'categories/list.html' |
| 33 | 33 | context_object_name = 'categories' |
| 34 | 34 | |
| 35 | - | |
| 36 | 35 | def get_queryset(self): |
| 37 | 36 | result = super(IndexView, self).get_queryset() |
| 38 | 37 | |
| ... | ... | @@ -77,8 +76,6 @@ class CreateCategory(views.SuperuserRequiredMixin, HasRoleMixin, LogMixin, Creat |
| 77 | 76 | template_name = 'categories/create.html' |
| 78 | 77 | success_url = reverse_lazy('categories:index') |
| 79 | 78 | |
| 80 | - | |
| 81 | - | |
| 82 | 79 | def get_initial(self): |
| 83 | 80 | initial = super(CreateCategory, self).get_initial() |
| 84 | 81 | |
| ... | ... | @@ -89,19 +86,25 @@ class CreateCategory(views.SuperuserRequiredMixin, HasRoleMixin, LogMixin, Creat |
| 89 | 86 | initial['description'] = category.description |
| 90 | 87 | initial['name'] = category.name |
| 91 | 88 | initial['visible'] = category.visible |
| 92 | - | |
| 93 | 89 | |
| 94 | 90 | self.log_action = 'replicate' |
| 95 | 91 | |
| 96 | 92 | self.log_context['replicated_category_id'] = category.id |
| 97 | 93 | self.log_context['replicated_category_name'] = category.name |
| 98 | 94 | self.log_context['replicated_category_slug'] = category.slug |
| 95 | + | |
| 99 | 96 | return initial |
| 100 | 97 | |
| 101 | 98 | def get_context_data(self, **kwargs): |
| 102 | 99 | context = super(CreateCategory, self).get_context_data(**kwargs) |
| 103 | 100 | context['users_count'] = User.objects.all().count() |
| 104 | 101 | context['switch'] = True |
| 102 | + | |
| 103 | + if self.kwargs.get('slug'): | |
| 104 | + context['title'] = _('Replicate Category') | |
| 105 | + else: | |
| 106 | + context['title'] = _('Create Category') | |
| 107 | + | |
| 105 | 108 | return context |
| 106 | 109 | |
| 107 | 110 | |
| ... | ... | @@ -145,7 +148,6 @@ class DeleteCategory(LogMixin, DeleteView): |
| 145 | 148 | model = Category |
| 146 | 149 | template_name = 'categories/delete.html' |
| 147 | 150 | |
| 148 | - | |
| 149 | 151 | def delete(self, request, *args, **kwargs): |
| 150 | 152 | category = get_object_or_404(Category, slug = self.kwargs.get('slug')) |
| 151 | 153 | subjects = Subject.objects.filter(category = category) |
| ... | ... | @@ -181,7 +183,6 @@ class UpdateCategory(LogMixin, UpdateView): |
| 181 | 183 | login_url = reverse_lazy("users:login") |
| 182 | 184 | redirect_field_name = 'next' |
| 183 | 185 | |
| 184 | - | |
| 185 | 186 | def get_success_url(self): |
| 186 | 187 | self.log_context['category_id'] = self.object.id |
| 187 | 188 | self.log_context['category_name'] = self.object.name |
| ... | ... | @@ -191,8 +192,15 @@ class UpdateCategory(LogMixin, UpdateView): |
| 191 | 192 | |
| 192 | 193 | objeto = self.object.name |
| 193 | 194 | messages.success(self.request, _('Category "%s" updated successfully!')%(objeto)) |
| 195 | + | |
| 194 | 196 | return reverse_lazy('categories:index') |
| 195 | 197 | |
| 198 | + def get_context_data(self, **kwargs): | |
| 199 | + context = super(UpdateCategory, self).get_context_data(**kwargs) | |
| 200 | + context['title'] = _('Update Category') | |
| 201 | + | |
| 202 | + return context | |
| 203 | + | |
| 196 | 204 | @log_decorator_ajax('category', 'view', 'category') |
| 197 | 205 | def category_view_log(request, category): |
| 198 | 206 | action = request.GET.get('action') | ... | ... |