Commit f1874254b50ec08babe2cac880a8b18869d0522f

Authored by Jailson Dias
2 parents 491acec3 2797e1e1

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

amadeus/static/bootstrap-3.3.7/css/bootstrap.css
... ... @@ -6319,7 +6319,7 @@ button.close {
6319 6319 top: 0;
6320 6320 bottom: 0;
6321 6321 left: 0;
6322   - width: 15%;
  6322 + width: 5%;
6323 6323 font-size: 20px;
6324 6324 color: #fff;
6325 6325 text-align: center;
... ... @@ -6407,14 +6407,14 @@ button.close {
6407 6407 cursor: pointer;
6408 6408 background-color: #000 \9;
6409 6409 background-color: rgba(0, 0, 0, 0);
6410   - border: 1px solid #fff;
  6410 + border: 1px solid #bcbcbc;
6411 6411 border-radius: 10px;
6412 6412 }
6413 6413 .carousel-indicators .active {
6414 6414 width: 12px;
6415 6415 height: 12px;
6416 6416 margin: 0;
6417   - background-color: #fff;
  6417 + background-color: #d6d6d6;
6418 6418 }
6419 6419 .carousel-caption {
6420 6420 position: absolute;
... ... @@ -6455,7 +6455,7 @@ button.close {
6455 6455 padding-bottom: 30px;
6456 6456 }
6457 6457 .carousel-indicators {
6458   - bottom: 20px;
  6458 + bottom: -30px;
6459 6459 }
6460 6460 }
6461 6461 .clearfix:before,
... ...
amadeus/static/css/base/amadeus.css
... ... @@ -48,7 +48,7 @@ a:focus {
48 48  
49 49 /* Initial page starts */
50 50 .users-cloud {
51   -
  51 +
52 52 width: 100%;
53 53 height: 100%;
54 54 overflow: hidden;
... ... @@ -87,7 +87,7 @@ a:focus {
87 87  
88 88 .my-subjects-title {
89 89 font-family: Roboto;
90   - font-size: 18px;
  90 + font-size: 18px;
91 91 }
92 92  
93 93 /* initial page ends */
... ... @@ -172,7 +172,7 @@ a:focus {
172 172 }
173 173  
174 174 .subject-group {
175   - margin-left: 20px;
  175 + margin-left: 20px;
176 176 }
177 177  
178 178 .category-header > h4{
... ... @@ -298,9 +298,9 @@ a:focus {
298 298 }
299 299  
300 300 .navbar .logo {
301   - text-align: center;
  301 + text-align: center;
302 302 margin-top: -6px;
303   - height: 32px;
  303 + height: 32px;
304 304 width: 32px;
305 305 }
306 306 .navbar .project_name {
... ... @@ -385,8 +385,8 @@ a:focus {
385 385 padding-bottom: 15px !important;
386 386 }
387 387 .modal-footer {
388   - text-align: right;
389   - padding-top: 5px !important;
  388 + text-align: right;
  389 + padding-top: 5px !important;
390 390 }
391 391  
392 392 /* HEADER */
... ... @@ -427,7 +427,7 @@ a:focus {
427 427 /* Breadcrumbs */
428 428 .breadcrumb{
429 429 font-size: 16px;
430   - margin-bottom: 5px;
  430 + margin-bottom: 0px;
431 431 font-style: italic;
432 432 }
433 433 /* End Breadcrumbs */
... ... @@ -535,8 +535,8 @@ a:focus {
535 535  
536 536 /* Icon Topic */
537 537 .divMoreActions {
538   - text-align: right;
539   - height: 30px;
  538 + text-align: right;
  539 + height: 30px;
540 540 float: right;
541 541 width: 3%;
542 542 }
... ... @@ -550,12 +550,12 @@ a:focus {
550 550 }
551 551  
552 552 .moreAccordion button {
553   - margin-bottom: 0px;
  553 + margin-bottom: 0px;
554 554 margin-top: 8px;
555 555 }
556 556  
557 557 .titleTopic {
558   - padding-top: 10px;
  558 + padding-top: 10px;
559 559 padding-bottom: 10px;
560 560 }
561 561  
... ... @@ -567,9 +567,9 @@ a:focus {
567 567 right: 0;
568 568 }
569 569  
570   -.cards-content{
571   - padding-left: 0px;
572   - padding-right: 0px;
  570 +.cards-content{
  571 + padding-left: 0px;
  572 + padding-right: 0px;
573 573 font-family: Roboto;
574 574 font-size: 18px;
575 575 }
... ... @@ -577,12 +577,12 @@ a:focus {
577 577 margin-left: 4%;
578 578 }
579 579  
580   -.course, .subject, .topic {
581   - padding-top: 0px;
582   - padding-bottom: 0px;
  580 +.course, .subject, .topic {
  581 + padding-top: 0px;
  582 + padding-bottom: 0px;
583 583 }
584 584 .course-detail {
585   - padding-top: 10px;
  585 + padding-top: 10px;
586 586 padding-bottom: 10px;
587 587 }
588 588  
... ... @@ -1153,8 +1153,8 @@ li.item .notify_badge {
1153 1153  
1154 1154 /*Carrosel change*/
1155 1155  
1156   -
1157   -
  1156 +
  1157 +
1158 1158 .carousel-control.right{
1159 1159 background-image: none !important;
1160 1160 }
... ... @@ -1165,8 +1165,8 @@ li.item .notify_badge {
1165 1165  
1166 1166 /* CHART APP */
1167 1167 .pie-tooltip{
1168   -
1169   -
  1168 +
  1169 +
1170 1170 font-size: 30px;
1171 1171 left: 130px;
1172 1172 padding: 10px;
... ... @@ -1186,7 +1186,7 @@ li.item .notify_badge {
1186 1186 background: rgba(0, 0, 0, 0.8);
1187 1187 color: #fff;
1188 1188 border-radius: 2px;
1189   - pointer-events: none;
  1189 + pointer-events: none;
1190 1190 }
1191 1191  
1192 1192  
... ... @@ -1257,7 +1257,7 @@ div.dataTables_wrapper div.dataTables_paginate {
1257 1257  
1258 1258 #resources_accordion .panel-heading{
1259 1259 background-color: #c4c4c4 !important;
1260   -
  1260 +
1261 1261 }
1262 1262  
1263 1263 .delete-row{
... ... @@ -1287,7 +1287,7 @@ div.dataTables_wrapper div.dataTables_paginate {
1287 1287 margin-top: 0;
1288 1288 color: #bdbdbd;
1289 1289 }
1290   -
  1290 +
1291 1291 h5.one:before {
1292 1292 content: "";
1293 1293 display: block;
... ... @@ -1298,7 +1298,7 @@ div.dataTables_wrapper div.dataTables_paginate {
1298 1298 top: 50%;
1299 1299 z-index: 1;
1300 1300 }
1301   -
  1301 +
1302 1302 h5.one span {
1303 1303 background: #eee;
1304 1304 padding-right: 20px;
... ... @@ -1617,4 +1617,4 @@ div.dataTables_wrapper div.dataTables_paginate {
1617 1617 display: none;
1618 1618 }
1619 1619 }
1620   -/* End Chat */
1621 1620 \ No newline at end of file
  1621 +/* End Chat */
... ...
amadeus/static/js/crop.js
... ... @@ -1,66 +0,0 @@
1   -$(function () {
2   -
3   - /* Script para abrir o modal com a imagem selecionada */
4   - $("#id_image").change(function () {
5   - if (this.files && this.files[0]) {
6   - var reader = new FileReader();
7   - reader.onload = function (e) {
8   - $("#image").attr("src", e.target.result);
9   - $("#modalCrop").modal("show");
10   - }
11   - reader.readAsDataURL(this.files[0]);
12   - }
13   - });
14   -
15   - /* Scripts da caixa de corte da imagem */
16   - var $image = $("#image");
17   - var cropBoxData;
18   - var canvasData;
19   - $("#modalCrop").on("shown.bs.modal", function () {
20   - $image.cropper({
21   - viewMode: 1,
22   - aspectRatio: 1/1,
23   - minCropBoxWidth: 200,
24   - minCropBoxHeight: 200,
25   - ready: function () {
26   - $image.cropper("setCanvasData", canvasData);
27   - $image.cropper("setCropBoxData", cropBoxData);
28   - }
29   - });
30   - }).on("hidden.bs.modal", function () {
31   - cropBoxData = $image.cropper("getCropBoxData");
32   - canvasData = $image.cropper("getCanvasData");
33   - $image.cropper("destroy");
34   - });
35   -
36   - $(".js-zoom-in").click(function () {
37   - $image.cropper("zoom", 0.1);
38   - });
39   -
40   - $(".js-zoom-out").click(function () {
41   - $image.cropper("zoom", -0.1);
42   - });
43   -
44   - /* Script para pegar os valores das dimensões e depois fechar o modal */
45   - $(".js-crop-and-upload").click(function () {
46   - var cropData = $image.cropper("getData");
47   - $("#id_x").val(cropData["x"]);
48   - $("#id_y").val(cropData["y"]);
49   - $("#id_height").val(cropData["height"]);
50   - $("#id_width").val(cropData["width"]);
51   - $("#modalCrop").modal('hide');
52   - });
53   -
54   - /* Script para remover o arquivo enviado caso o usuário clique em cancelar*/
55   - $("#id_image").on('change', function(){
56   - console.log(this.value);
57   - });
58   -
59   - $('#crop_cancel').on('click', function(e){
60   - var input = $("#id_image");
61   - var holder = $("#pic_holder");
62   - input.replaceWith(input.val('').clone(true));
63   - holder.replaceWith(holder.val('').clone(true));
64   - });
65   -
66   -});
amadeus/static/js/crop_news.js
... ... @@ -18,10 +18,11 @@ $(function () {
18 18 var canvasData;
19 19 $("#modalCrop").on("shown.bs.modal", function () {
20 20 $image.cropper({
21   - viewMode: 1,
22   - aspectRatio: 1/1,
23   - minCropBoxWidth: 700,
  21 + viewMode: 1 ,
  22 + aspectRatio: 24/5,
  23 + minCropBoxWidth: 200,
24 24 minCropBoxHeight: 200,
  25 + dragMode: 'move',
25 26 ready: function () {
26 27 $image.cropper("setCanvasData", canvasData);
27 28 $image.cropper("setCropBoxData", cropBoxData);
... ...
amadeus/templates/base.html
... ... @@ -31,8 +31,6 @@
31 31 <link rel="stylesheet" type="text/css" href="{% static 'css/jPages.css' %}">
32 32  
33 33 <script src="{% static 'js/cropper.min.js' %}"></script> <!-- Js for cropper-->
34   - <script src="{% static 'js/crop.js' %}"></script> <!-- Js for cropper-->
35   - <script src="{% static 'js/crop_news.js' %}"></script>
36 34 <link href="{% static 'css/cropper.min.css' %}" rel="stylesheet"> <!-- CSS for cropper-->
37 35  
38 36 <script type="text/javascript" src="{% static 'js/printThis.js' %}"></script> <!-- Print this plugin js-->
... ...
news/admin.py
1 1 from django.contrib import admin
2   -
  2 +from .models import News
3 3 # Register your models here.
  4 +
  5 +class NewsAdmin(admin.ModelAdmin):
  6 + list_display = ['title', 'slug', 'creator', 'create_date']
  7 + search_fields = ['title']
  8 +
  9 +admin.site.register(News, NewsAdmin)
... ...
news/forms.py
... ... @@ -7,6 +7,7 @@ from os.path import join
7 7 from PIL import Image
8 8 import os
9 9 from amadeus import settings
  10 +from django.utils.html import strip_tags
10 11  
11 12 class NewsForm(forms.ModelForm):
12 13 MAX_UPLOAD_SIZE = 5*1024*1024
... ... @@ -30,7 +31,7 @@ class NewsForm(forms.ModelForm):
30 31 image = Image.open(self.instance.image)
31 32 if not x is None:
32 33 cropped_image = image.crop((x, y, w+x, h+y))
33   - resized_image = cropped_image.resize((700, 200), Image.ANTIALIAS)
  34 + resized_image = cropped_image.resize((1200, 250), Image.ANTIALIAS)
34 35  
35 36 folder_path = join(settings.MEDIA_ROOT, 'news')
36 37 #check if the folder already exists
... ... @@ -78,3 +79,13 @@ class NewsForm(forms.ModelForm):
78 79 return ValueError
79 80  
80 81 return image
  82 + def clean_content(self):
  83 + content = self.cleaned_data.get('content', '')
  84 + cleaned_content = strip_tags(content)
  85 +
  86 + if cleaned_content == '':
  87 + self._errors['content'] = [_('This field is required.')]
  88 +
  89 + return ValueError
  90 +
  91 + return content
... ...
news/models.py
... ... @@ -18,7 +18,7 @@ class News(models.Model):
18 18 title = models.CharField( _("Title"), unique = True,max_length= 200)
19 19 slug = AutoSlugField(_("Slug"),populate_from='title',unique=True)
20 20 image = models.ImageField(verbose_name = _('News Image'), upload_to = 'news/', validators = [validate_img_extension],blank= True)
21   - content = models.TextField(_('News Content'))
  21 + content = models.TextField(_('News Content'), blank = True)
22 22 create_date = models.DateTimeField(_('Create Date'), auto_now_add = True)
23 23 creator = models.ForeignKey(User, verbose_name = _('Creator'), related_name = "news_creator_user", null = True)
24 24 class Meta:
... ...
news/templates/news/_form.html
... ... @@ -19,13 +19,8 @@
19 19  
20 20  
21 21 {% elif field.auto_id == 'id_content' %}
22   - {% if field.field.required %}
23 22 <label for="{{ field.auto_id }}">{{ field.label }} <span>*</span></label>
24   - {% else %}
25   -
26   - <label for="{{ field.auto_id }}">{{ field.label }}</label>
27   - {% endif %}
28   - {% render_field field class='form-control text_wysiwyg' %}
  23 + {% render_field field class='form-control text_wysiwyg' %}
29 24 {% else %}
30 25  
31 26 {% if field.auto_id == 'id_title' %}
... ... @@ -66,4 +61,6 @@
66 61 </div>
67 62  
68 63 </form>
  64 +<script src="{% static 'js/crop_news.js' %}"></script> <!-- Js for cropper-->
  65 +
69 66 {% include 'users/modal_crop.html' %}
... ...
news/templates/news/create.html
... ... @@ -21,4 +21,5 @@
21 21 <br clear="all">
22 22 <br clear="all">
23 23  
  24 +<script src="{% static 'js/crop_news.js' %}"></script> <!-- Js for cropper-->
24 25 {% endblock %}
... ...
news/templates/news/list.html
... ... @@ -3,11 +3,17 @@
3 3 {% load static i18n django_bootstrap_breadcrumbs permission_tags pagination %}
4 4  
5 5 {% block breadcrumbs %}
6   - {{ block.super }}
  6 + {{ block.super }}
  7 + {% if user.is_staff %}
7 8 {% trans 'Manage News' as manage_news %}
8 9 {% breadcrumb manage_news 'news:manage_news' %}
  10 + {% else %}
  11 + {% trans 'News' as news %}
  12 + {% breadcrumb news 'news:manage_news' %}
  13 + {% endif %}
9 14 {% endblock %}
10 15  
  16 +
11 17 {% block render_breadcrumbs %}
12 18 {% render_breadcrumbs %}
13 19 {% endblock %}
... ... @@ -41,9 +47,11 @@
41 47 </div>
42 48 </form>
43 49 </div>
  50 + {% if user.is_staff %}
44 51 <div class="col-md-3">
45 52 <a href="{% url 'news:create' %}" class="pull-right btn btn-success btn-raised btn-md"><i class="fa fa-plus"></i> {% trans 'Create News' %}</a>
46 53 </div>
  54 + {% endif %}
47 55 </div>
48 56  
49 57 {% if news %}
... ... @@ -54,12 +62,14 @@
54 62 <a href="{% url 'news:view' new.slug %}"><h3> <b>{{ new }}</b> </h3></a>
55 63 <p>{{ new.creator}}, em {{ new.create_date }}</p>
56 64 </div>
  65 + {% if user.is_staff %}
57 66 <div class="col-md-6">
58 67 <div align="right">
59 68 <a href="{% url 'news:update' new.slug %}" class="btn btn-success btn-raised btn-sm"><i class="fa fa-edit"></i> {% trans 'Edit' %}</a>
60 69 <a href="javascript:delete_news.get('{% url 'news:delete' new.slug %}','#news','#modal_remove')" class="btn btn-default btn-raised btn-sm" class="btn btn-default btn-raised btn-sm"><i class="fa fa-trash"></i> {% trans 'Delete' %}</a>
61 70 </div>
62 71 </div>
  72 + {% endif %}
63 73 </div>
64 74  
65 75 </div>
... ... @@ -92,4 +102,5 @@ var delete_news = {
92 102  
93 103 </script>
94 104  
  105 +<script src="{% static 'js/crop_news.js' %}"></script> <!-- Js for cropper-->
95 106 {% endblock %}
... ...
news/templates/news/search.html
... ... @@ -57,7 +57,7 @@
57 57 <div class="col-md-6">
58 58 <div align="right">
59 59 <a href="{% url 'news:update' new.slug %}" class="btn btn-success btn-raised btn-sm"><i class="fa fa-edit"></i> {% trans 'Edit' %}</a>
60   - <a href="" class="btn btn-default btn-raised btn-sm"><i class="fa fa-trash"></i> {% trans 'Delete' %}</a>
  60 + <a href="javascript:delete_news.get('{% url 'news:delete' new.slug %}','#news','#modal_remove')" class="btn btn-default btn-raised btn-sm"><i class="fa fa-trash"></i> {% trans 'Delete' %}</a>
61 61 </div>
62 62 </div>
63 63 </div>
... ... @@ -76,4 +76,20 @@
76 76  
77 77 </div>
78 78  
  79 +<script type="text/javascript">
  80 +var delete_news = {
  81 + get: function (url, id_modal, id_div_modal){
  82 + $.get(url, function(data){
  83 + if($(id_modal).length){
  84 + $(id_div_modal).empty();
  85 + $(id_div_modal).append(data);
  86 + } else {
  87 + $(id_div_modal).append(data);
  88 + }
  89 + $(id_modal).modal('show');
  90 + });
  91 + }
  92 +};
  93 +
  94 +</script>
79 95 {% endblock %}
... ...
news/templates/news/update.html
... ... @@ -21,4 +21,5 @@
21 21 <br clear="all">
22 22 <br clear="all">
23 23  
  24 +<script src="{% static 'js/crop_news.js' %}"></script> <!-- Js for cropper-->
24 25 {% endblock %}
... ...
news/views.py
... ... @@ -78,6 +78,11 @@ class CreateNewsView(LoginRequiredMixin,LogMixin,generic.edit.CreateView):
78 78 template_name = 'news/create.html'
79 79 form_class = NewsForm
80 80  
  81 + def dispatch(self, request, *args, **kwargs):
  82 + if not request.user.is_staff:
  83 + return redirect(reverse_lazy('subjects:home'))
  84 + return super(CreateNewsView, self).dispatch(request, *args, **kwargs)
  85 +
81 86 def form_valid(self, form):
82 87 self.object = form.save(commit = False)
83 88 creator = self.request.user
... ... @@ -117,6 +122,11 @@ class UpdateNewsView(LoginRequiredMixin,LogMixin,generic.UpdateView):
117 122 form_class = NewsForm
118 123 model = News
119 124  
  125 + def dispatch(self, request, *args, **kwargs):
  126 + if not request.user.is_staff:
  127 + return redirect(reverse_lazy('subjects:home'))
  128 + return super(UpdateNewsView, self).dispatch(request, *args, **kwargs)
  129 +
120 130 def get_success_url(self):
121 131 messages.success(self.request, _('News successfully created!'))
122 132  
... ... @@ -198,6 +208,11 @@ class DeleteNewsView(LoginRequiredMixin,LogMixin,generic.DeleteView):
198 208 model = News
199 209 template_name = 'news/delete.html'
200 210  
  211 + def dispatch(self, request, *args, **kwargs):
  212 + if not request.user.is_staff:
  213 + return redirect(reverse_lazy('subjects:home'))
  214 + return super(DeleteNewsView, self).dispatch(request, *args, **kwargs)
  215 +
201 216 def delete(self, request, *args, **kwargs):
202 217 news = get_object_or_404(News, slug = self.kwargs.get('slug'))
203 218 return super(DeleteNewsView, self).delete(self, request, *args, **kwargs)
... ...
subjects/templates/subjects/home.html 0 → 100644
... ... @@ -0,0 +1,84 @@
  1 +{% extends "categories/home.html" %}
  2 +
  3 +{% load static pagination i18n %}
  4 +
  5 +{% block content %}
  6 + {% if messages %}
  7 + {% for message in messages %}
  8 + <div class="alert alert-{{ message.tags }} alert-dismissible" role="alert">
  9 + <button type="button" class="close" data-dismiss="alert" aria-label="Close">
  10 + <span aria-hidden="true">&times;</span>
  11 + </button>
  12 + <p>{{ message }}</p>
  13 + </div>
  14 + {% endfor %}
  15 + {% endif %}
  16 +
  17 +
  18 +
  19 +
  20 + <!-- Wrapper for slides -->
  21 + <div id="myCarousel" class="carousel slide " data-ride="carousel">
  22 + <!-- Indicators -->
  23 + <ol class="carousel-indicators">
  24 + <li data-target="#myCarousel" data-slide-to="0" class="active"></li>
  25 + <li data-target="#myCarousel" data-slide-to="1"></li>
  26 + <li data-target="#myCarousel" data-slide-to="2"></li>
  27 + <li data-target="#myCarousel" data-slide-to="3"></li>
  28 + </ol>
  29 +
  30 +<div class="carousel-inner" role="listbox">
  31 + {% for new in news %}
  32 + {% if forloop.first %}
  33 + <div class="item active" style="text-align:center">
  34 + <span><a href="{% url 'news:view' new.slug %}"> <img src="{{ new.image.url }}" alt="Image"> </a></span>
  35 + </div>
  36 + {% else %}
  37 + <div class="item" style="text-align:center">
  38 + <span><a href="{% url 'news:view' new.slug %}"> <img src="{{ new.image.url }}" alt="Image"> </a></span>
  39 + </div>
  40 + {% endif%}
  41 + {% endfor %}
  42 +
  43 +</div>
  44 +
  45 + <!-- Left and right controls -->
  46 + <a class="left carousel-control" href="#myCarousel" role="button" data-slide="prev">
  47 + <span class="glyphicon glyphicon-chevron-left" aria-hidden="true"></span>
  48 + <span class="sr-only">Previous</span>
  49 + </a>
  50 + <a class="right carousel-control" href="#myCarousel" role="button" data-slide="next">
  51 + <span class="glyphicon glyphicon-chevron-right" aria-hidden="true"></span>
  52 + <span class="sr-only">Next</span>
  53 + </a>
  54 +</div>
  55 +
  56 +
  57 +
  58 +
  59 +
  60 +
  61 + <div class="col-md-12 cards-content">
  62 + <h2 class=" my-subjects-title"><b><i>{% trans "My Subjects" %} ({{ total_subs }})</i></b></h2>
  63 +
  64 + {% if subjects|length > 0 %}
  65 + <div class="panel-group" id="subject-accordion" role="tablist" aria-multiselectable="true">
  66 + {% for subject in subjects %}
  67 + {% include "subjects/subject_card.html" with accordion_id="subject-accordion" %}
  68 + {% endfor %}
  69 +
  70 + {% pagination request paginator page_obj %}
  71 + </div>
  72 + {% else %}
  73 + <div class="text-center no-subjects">
  74 + <i class="fa fa-graduation-cap"></i>
  75 + <h4>{% trans 'You still do not posses any subject in our platform' %}</h4>
  76 + </div>
  77 + {% endif %}
  78 + </div>
  79 +
  80 + <div id="modal_subject"></div>
  81 +
  82 + <script type="text/javascript" src="{% static 'subjects/js/modal_subject.js' %}"></script>
  83 + <script type="text/javascript" src="{% static 'js/category.js' %}"></script>
  84 +{% endblock content %}
... ...
subjects/templates/subjects/initial.html
... ... @@ -18,7 +18,6 @@
18 18  
19 19  
20 20 <!-- Wrapper for slides -->
21   - {% if user.is_staff %}
22 21 <div id="myCarousel" class="carousel slide " data-ride="carousel">
23 22 <!-- Indicators -->
24 23 <ol class="carousel-indicators">
... ... @@ -28,7 +27,13 @@
28 27 <li data-target="#myCarousel" data-slide-to="3"></li>
29 28 </ol>
30 29  
31   - <div class="carousel-inner" role="listbox">
  30 +<div class="carousel-inner" role="listbox">
  31 + {% for new in news %}
  32 + <div class="item" style="text-align:center">
  33 + <span><a href="{% url 'news:view' new.slug %}"> <img src="{{ new.image.url }}" alt="Image"> </a></span>
  34 + </div>
  35 + {% endfor %}
  36 +
32 37 <div class="item active">
33 38 <h2 class=" my-subjects-title"><b><i>{% trans "Most popular keywords" %}</i></b></h2>
34 39 <div id="" class="col-md-12">
... ... @@ -50,7 +55,7 @@
50 55 </div>
51 56 </div>
52 57  
53   - </div>
  58 +</div>
54 59  
55 60 <!-- Left and right controls -->
56 61 <a class="left carousel-control" href="#myCarousel" role="button" data-slide="prev">
... ... @@ -62,27 +67,6 @@
62 67 <span class="sr-only">Next</span>
63 68 </a>
64 69 </div>
65   - {% else %}
66   -
67   - <h2 class=" my-subjects-title"><b><i>{% trans "Most popular keywords" %}</i></b></h2>
68   - <div id="" class="col-md-12">
69   - <div class="users-cloud div-users-cloud">
70   - <ul class=" users-cloud">
71   - {% for tag in tags %}
72   - {% if tag.1 == 0 %}
73   - <li class="big"><a href="{% url 'subjects:search' %}?search={{tag.0}}">{{tag.0}}</a></li>
74   - {% elif tag.1 == 1 %}
75   - <li class="medium"><a href="{% url 'subjects:search' %}?search={{tag.0}}">{{tag.0}}</a></li>
76   - {% else %}
77   - <li class="small"><a href="{% url 'subjects:search' %}?search={{tag.0}}">{{tag.0}}</a></li>
78   - {% endif %}
79   -
80   -
81   - {% endfor %}
82   - </ul>
83   - </div>
84   - </div>
85   - {% endif %}
86 70  
87 71  
88 72  
... ...
subjects/views.py
... ... @@ -32,13 +32,14 @@ from .forms import CreateSubjectForm, UpdateSubjectForm
32 32 from .utils import has_student_profile, has_professor_profile, count_subjects, get_category_page
33 33 from users.models import User
34 34 from topics.models import Topic, Resource
  35 +from news.models import News
35 36  
36 37 from amadeus.permissions import has_category_permissions, has_subject_permissions, has_subject_view_permissions, has_resource_permissions
37 38  
38 39 class HomeView(LoginRequiredMixin, ListView):
39 40 login_url = reverse_lazy("users:login")
40 41 redirect_field_name = 'next'
41   - template_name = 'subjects/initial.html'
  42 + template_name = 'subjects/home.html'
42 43 context_object_name = 'subjects'
43 44 paginate_by = 10
44 45 total = 0
... ... @@ -59,6 +60,7 @@ class HomeView(LoginRequiredMixin, ListView):
59 60 context = super(HomeView, self).get_context_data(**kwargs)
60 61 context['title'] = _('Home')
61 62 context['show_buttons'] = True #So it shows subscribe and access buttons
  63 + context['news'] = News.objects.all()
62 64  
63 65 #bringing users
64 66 tag_amount = 50
... ... @@ -521,8 +523,8 @@ class SubjectDetailView(LoginRequiredMixin, LogMixin, DetailView):
521 523 expire_time = settings.SESSION_SECURITY_EXPIRE_AFTER
522 524  
523 525 context['participants'] = User.objects.filter(
524   - Q(is_staff = True) | Q(subject_student__slug = sub) |
525   - Q(professors__slug = sub) |
  526 + Q(is_staff = True) | Q(subject_student__slug = sub) |
  527 + Q(professors__slug = sub) |
526 528 Q(coordinators__subject_category__slug = sub)
527 529 ).extra(select = {'status': status_query}, select_params=(expire_time, expire_time,),).distinct().order_by('status', 'social_name','username').exclude(email = self.request.user.email)
528 530  
... ...
users/static/js/crop.js 0 → 100644
... ... @@ -0,0 +1,66 @@
  1 +$(function () {
  2 +
  3 + /* Script para abrir o modal com a imagem selecionada */
  4 + $("#id_image").change(function () {
  5 + if (this.files && this.files[0]) {
  6 + var reader = new FileReader();
  7 + reader.onload = function (e) {
  8 + $("#image").attr("src", e.target.result);
  9 + $("#modalCrop").modal("show");
  10 + }
  11 + reader.readAsDataURL(this.files[0]);
  12 + }
  13 + });
  14 +
  15 + /* Scripts da caixa de corte da imagem */
  16 + var $image = $("#image");
  17 + var cropBoxData;
  18 + var canvasData;
  19 + $("#modalCrop").on("shown.bs.modal", function () {
  20 + $image.cropper({
  21 + viewMode: 1,
  22 + aspectRatio: 1/1,
  23 + minCropBoxWidth: 200,
  24 + minCropBoxHeight: 200,
  25 + ready: function () {
  26 + $image.cropper("setCanvasData", canvasData);
  27 + $image.cropper("setCropBoxData", cropBoxData);
  28 + }
  29 + });
  30 + }).on("hidden.bs.modal", function () {
  31 + cropBoxData = $image.cropper("getCropBoxData");
  32 + canvasData = $image.cropper("getCanvasData");
  33 + $image.cropper("destroy");
  34 + });
  35 +
  36 + $(".js-zoom-in").click(function () {
  37 + $image.cropper("zoom", 0.1);
  38 + });
  39 +
  40 + $(".js-zoom-out").click(function () {
  41 + $image.cropper("zoom", -0.1);
  42 + });
  43 +
  44 + /* Script para pegar os valores das dimensões e depois fechar o modal */
  45 + $(".js-crop-and-upload").click(function () {
  46 + var cropData = $image.cropper("getData");
  47 + $("#id_x").val(cropData["x"]);
  48 + $("#id_y").val(cropData["y"]);
  49 + $("#id_height").val(cropData["height"]);
  50 + $("#id_width").val(cropData["width"]);
  51 + $("#modalCrop").modal('hide');
  52 + });
  53 +
  54 + /* Script para remover o arquivo enviado caso o usuário clique em cancelar*/
  55 + $("#id_image").on('change', function(){
  56 + console.log(this.value);
  57 + });
  58 +
  59 + $('#crop_cancel').on('click', function(e){
  60 + var input = $("#id_image");
  61 + var holder = $("#pic_holder");
  62 + input.replaceWith(input.val('').clone(true));
  63 + holder.replaceWith(holder.val('').clone(true));
  64 + });
  65 +
  66 +});
... ...
users/templates/users/_form.html
... ... @@ -83,3 +83,4 @@
83 83  
84 84 </form>
85 85 {% include 'users/modal_crop.html' %}
  86 +<script src="{% static 'js/crop.js' %}"></script> <!-- Js for cropper-->
... ...
users/templates/users/list.html
... ... @@ -80,4 +80,7 @@
80 80 <div id="modal_remove">
81 81  
82 82 </div>
  83 +
  84 +
  85 +<script src="{% static 'js/crop.js' %}"></script> <!-- Js for cropper-->
83 86 {% endblock %}
... ...
users/templates/users/register.html
... ... @@ -101,6 +101,7 @@
101 101 </div>
102 102  
103 103 {% include 'users/modal_crop.html' %}
  104 +<script src="{% static 'js/crop.js' %}"></script> <!-- Js for cropper-->
104 105  
105 106 {% endblock %}
106 107  
... ...