diff --git a/amadeus/formats/__init__.py b/amadeus/formats/__init__.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/amadeus/formats/__init__.py diff --git a/amadeus/formats/en/__init__.py b/amadeus/formats/en/__init__.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/amadeus/formats/en/__init__.py diff --git a/amadeus/formats/en/formats.py b/amadeus/formats/en/formats.py new file mode 100644 index 0000000..60de108 --- /dev/null +++ b/amadeus/formats/en/formats.py @@ -0,0 +1,2 @@ +DATETIME_FORMAT = '%m/%d/%Y %I:%M %p' +DATETIME_INPUT_FORMATS = ('%m/%d/%Y %I:%M %p',) \ No newline at end of file diff --git a/amadeus/formats/pt_BR/__init__.py b/amadeus/formats/pt_BR/__init__.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/amadeus/formats/pt_BR/__init__.py diff --git a/amadeus/formats/pt_BR/formats.py b/amadeus/formats/pt_BR/formats.py new file mode 100644 index 0000000..7fa135e --- /dev/null +++ b/amadeus/formats/pt_BR/formats.py @@ -0,0 +1,2 @@ +DATETIME_FORMAT = '%d/%m/%Y %H:%M' +DATETIME_INPUT_FORMATS = ('%d/%m/%Y %H:%M',) \ No newline at end of file diff --git a/amadeus/settings.py b/amadeus/settings.py index c164472..caa288d 100644 --- a/amadeus/settings.py +++ b/amadeus/settings.py @@ -172,7 +172,7 @@ USE_L10N = True USE_TZ = True - +FORMAT_MODULE_PATH = 'amadeus.formats' # Static files (CSS, JavaScript, Images) # https://docs.djangoproject.com/en/1.9/howto/static-files/ @@ -269,10 +269,6 @@ OAUTH2_PROVIDER = { #For date purposes -DATETIME_INPUT_FORMATS.append('%d/%m/%y') -DATETIME_INPUT_FORMATS.append('%m/%d/%y') -DATETIME_INPUT_FORMATS.append('%m/%d/%Y %I:%M %p') -DATETIME_INPUT_FORMATS.append('%d/%m/%Y %H:%M') DATE_INPUT_FORMATS.append('%d/%m/%y') DATE_INPUT_FORMATS.append('%m/%d/%y') diff --git a/goals/forms.py b/goals/forms.py index 03227b7..5a5e36b 100644 --- a/goals/forms.py +++ b/goals/forms.py @@ -1,5 +1,6 @@ # coding=utf-8 from django import forms +from datetime import datetime from django.conf import settings from django.utils.translation import ugettext_lazy as _ from django.forms.models import inlineformset_factory @@ -13,21 +14,23 @@ from .models import Goals, GoalItem class GoalsForm(forms.ModelForm): subject = None + topic = 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) + self.topic = kwargs['initial'].get('topic', None) if self.instance.id: self.subject = self.instance.topic.subject + self.topic = self.instance.topic 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 @@ -43,16 +46,27 @@ class GoalsForm(forms.ModelForm): def clean(self): cleaned_data = super(GoalsForm, self).clean() - topic = cleaned_data.get('topic', None) + limit_submission_date = cleaned_data.get('limit_submission_date', None) - if topic: + if self.topic: if self.instance.id: - exist = topic.resource_topic.filter(goals__isnull = False).exclude(id = self.instance.id).exists() + exist = self.topic.resource_topic.filter(goals__isnull = False).exclude(id = self.instance.id).exists() else: - exist = topic.resource_topic.filter(goals__isnull = False).exists() + exist = self.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))) + self.add_error('name', _('There already is another resource with the goals specification for the Topic %s')%(str(self.topic))) + + if limit_submission_date: + if not limit_submission_date == ValueError: + if not self.instance.id and limit_submission_date.date() < datetime.today().date(): + self.add_error('limit_submission_date', _("This input should be filled with a date equal or after today's date.")) + + if limit_submission_date.date() < self.subject.init_date: + self.add_error('limit_submission_date', _('This input should be filled with a date equal or after the subject begin date.')) + + if limit_submission_date.date() > self.subject.end_date: + self.add_error('limit_submission_date', _('This input should be filled with a date equal or after the subject end date.')) return cleaned_data @@ -90,5 +104,18 @@ class GoalItemForm(forms.ModelForm): model = GoalItem fields = ['description', 'ref_value'] + def clean(self): + cleaned_data = super(GoalItemForm, self).clean() + + description = cleaned_data.get('description', None) + ref_value = cleaned_data.get('ref_value', None) + + if ref_value and ref_value != "0": + if not description: + self.add_error('description', _('This field is required.')) + + return cleaned_data + + 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/models.py b/goals/models.py index cc9c4bc..7d3f3d0 100644 --- a/goals/models.py +++ b/goals/models.py @@ -20,7 +20,7 @@ class Goals(Resource): return reverse_lazy('file_links:download', args = (), kwargs = {'slug': self.slug}) def update_link(self): - return 'file_links:update' + return 'goals:update' def delete_link(self): return 'file_links:delete' @@ -29,7 +29,7 @@ class Goals(Resource): return _('Are you sure you want delete the goals') class GoalItem(models.Model): - description = models.CharField(_('Description'), max_length = 255) + description = models.CharField(_('Description'), max_length = 255, blank = True) 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 index c5eb934..3bb20b8 100644 --- a/goals/templates/goals/_form.html +++ b/goals/templates/goals/_form.html @@ -102,7 +102,9 @@
0% - {% render_field item.ref_value class='slider_value' data-slider-min="0" data-slider-max="100" %} + {% with item.ref_value.value|default:"0" as item_value %} + {% render_field item.ref_value class='slider_value' data-slider-value=item_value data-slider-min="0" data-slider-max="100" %} + {% endwith %} 100%
@@ -192,7 +194,7 @@ {% endif %} - +
@@ -212,6 +214,7 @@ {% for notify in pendencies_form %}
+ {{ notify.errors }} {% render_field notify.id %} {% render_field notify.resource %} {% render_field notify.subject class='pend_subj' %} @@ -390,7 +393,6 @@ $(function() { $(".slider_value").bootstrapSlider({ tooltip: 'always', - value: '0' }); $('.goalitems').formset({ @@ -477,6 +479,10 @@ {% if not pendencies_form.is_valid and pendencies_form.is_bound %} $("#notifications").collapse('toggle'); {% endif %} + + {% if not goalitems_form.is_valid and goalitems_form.is_bound %} + $("#goal_items").collapse('toggle'); + {% endif %} }); \ No newline at end of file diff --git a/goals/templates/goals/update.html b/goals/templates/goals/update.html new file mode 100644 index 0000000..99929bf --- /dev/null +++ b/goals/templates/goals/update.html @@ -0,0 +1,37 @@ +{% 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 'Edit: Topic Goals ' as bread %} + {% breadcrumb bread 'goals:update' topic.slug goal.slug %} +{% endblock %} + +{% block content %} +
+
+
+ {% include 'goals/_form.html' %} +
+
+
+
+
+{% endblock %} diff --git a/goals/urls.py b/goals/urls.py index 67e6698..76882fb 100644 --- a/goals/urls.py +++ b/goals/urls.py @@ -5,4 +5,5 @@ from . import views urlpatterns = [ url(r'^create/(?P[\w_-]+)/$', views.CreateView.as_view(), name = 'create'), + url(r'^update/(?P[\w_-]+)/(?P[\w_-]+)/$', views.UpdateView.as_view(), name = 'update'), ] diff --git a/goals/views.py b/goals/views.py index 7f41d9c..7775e36 100644 --- a/goals/views.py +++ b/goals/views.py @@ -90,7 +90,7 @@ class CreateView(LoginRequiredMixin, generic.edit.CreateView): if not self.object.topic.visible and not self.object.topic.repository: self.object.visible = False - #self.object.save() + self.object.save() pendencies_form.instance = self.object pendencies_form.save(commit = False) @@ -98,11 +98,22 @@ class CreateView(LoginRequiredMixin, generic.edit.CreateView): for pform in pendencies_form.forms: pend_form = pform.save(commit = False) - #if not pend_form.action == "": - #pend_form.save() + if not pend_form.action == "": + pend_form.save() goalitems_form.instance = self.object goalitems_form.save(commit = False) + + g_order = 1 + + for gform in goalitems_form.forms: + goal_form = gform.save(commit = False) + + if not goal_form.description == "": + goal_form.order = g_order + goal_form.save() + + g_order += 1 return redirect(self.get_success_url()) @@ -131,4 +142,119 @@ class CreateView(LoginRequiredMixin, generic.edit.CreateView): success_url = reverse_lazy('subjects:view', kwargs = {'slug': self.object.topic.subject.slug}) + return success_url + +class UpdateView(LoginRequiredMixin, generic.UpdateView): + login_url = reverse_lazy("users:login") + redirect_field_name = 'next' + + template_name = 'goals/update.html' + model = Goals + form_class = GoalsForm + context_object_name = 'goal' + + def dispatch(self, request, *args, **kwargs): + slug = self.kwargs.get('topic_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(UpdateView, self).dispatch(request, *args, **kwargs) + + def get(self, request, *args, **kwargs): + self.object = self.get_object() + + form_class = self.get_form_class() + form = self.get_form(form_class) + + slug = self.kwargs.get('topic_slug', '') + topic = get_object_or_404(Topic, slug = slug) + + pendencies_form = InlinePendenciesFormset(instance = self.object, initial = [{'subject': topic.subject.id, 'actions': [("", "-------"),("view", _("Visualize")), ("submit", _("Submit"))]}]) + goalitems_form = InlineGoalItemFormset(instance = self.object) + + 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 = self.get_object() + + form_class = self.get_form_class() + form = self.get_form(form_class) + + slug = self.kwargs.get('topic_slug', '') + topic = get_object_or_404(Topic, slug = slug) + + pendencies_form = InlinePendenciesFormset(self.request.POST, instance = self.object, initial = [{'subject': topic.subject.id, 'actions': [("", "-------"),("view", _("Visualize")), ("submit", _("Submit"))]}]) + goalitems_form = InlineGoalItemFormset(self.request.POST, instance = self.object) + + 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 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) + + 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 form in pendencies_form.forms: + pend_form = form.save(commit = False) + + if not pend_form.action == "": + pend_form.save() + + goalitems_form.instance = self.object + goalitems_form.save(commit = False) + + g_order = self.object.item_goal.count() + 1 + + for gform in goalitems_form.forms: + goal_form = gform.save(commit = False) + + if not goal_form.description == "": + goal_form.order = g_order + goal_form.save() + + g_order += 1 + + return redirect(self.get_success_url()) + + def get_context_data(self, **kwargs): + context = super(UpdateView, self).get_context_data(**kwargs) + + context['title'] = _('Update Topic Goals') + + slug = self.kwargs.get('topic_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 YouTube Video "%s" was updated successfully!')%(self.object.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/pendencies/forms.py b/pendencies/forms.py index ccde5b4..dc94056 100644 --- a/pendencies/forms.py +++ b/pendencies/forms.py @@ -4,6 +4,8 @@ import datetime from django import forms from django.conf import settings from django.utils.translation import ugettext_lazy as _ +from django.utils.formats import get_format +from django.utils import timezone from subjects.models import Subject @@ -18,8 +20,10 @@ class PendenciesForm(forms.ModelForm): if kwargs.get('initial', None): self.fields['action'].choices = kwargs['initial'].get('actions', []) - self.fields['begin_date'].input_formats = settings.DATETIME_INPUT_FORMATS - self.fields['end_date'].input_formats = settings.DATETIME_INPUT_FORMATS + datetime_formats = get_format('DATETIME_INPUT_FORMATS') + + self.fields['begin_date'].input_formats = datetime_formats + self.fields['end_date'].input_formats = datetime_formats begin_date_check = forms.BooleanField(required = False) end_date_check = forms.BooleanField(required = False) @@ -89,21 +93,23 @@ class PendenciesLimitedForm(forms.ModelForm): if kwargs.get('initial', None): self.fields['action'].choices = kwargs['initial'].get('actions', []) + + datetime_formats = get_format('DATETIME_INPUT_FORMATS') + + self.fields['begin_date'].input_formats = datetime_formats + self.fields['end_date'].input_formats = datetime_formats + self.fields['limit_date'].input_formats = datetime_formats 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'] + fields = ['action', 'begin_date', 'end_date', 'limit_date'] def clean(self): cleaned_data = super(PendenciesLimitedForm, self).clean() - print(self.data) pend_id = cleaned_data.get('id', None) @@ -111,14 +117,12 @@ class PendenciesLimitedForm(forms.ModelForm): 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) + 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) + limit_check = cleaned_data.get('limit_date_check', False) subject_id = cleaned_data.get('subject', None) - print(limit_submission_date) - if begin_check or end_check or limit_date: if not action: self.add_error('action', _('This field is required.')) @@ -129,8 +133,8 @@ class PendenciesLimitedForm(forms.ModelForm): if not end_date and end_check: self.add_error('end_date', _('This field is required.')) - #if not limit_date and limit_check: - # self.add_error('limit_date', _('This field is required.')) + if not limit_date and limit_check: + self.add_error('limit_date', _('This field is required.')) if begin_date and end_date: if not begin_date == ValueError and not end_date == ValueError: @@ -138,17 +142,17 @@ class PendenciesLimitedForm(forms.ModelForm): 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 begin_date and limit_date: - # if not begin_date == ValueError and not limit_date == ValueError: - # if begin_date > limit_date: - # self.add_error('begin_date', _('This input should be filled with a date equal or before the Limit Date.')) - # self.add_error('limit_date', _('This input should be filled with a date equal or after the Begin Date.')) + if begin_date and limit_date: + if not begin_date == ValueError and not limit_date == ValueError: + if begin_date > limit_date: + self.add_error('begin_date', _('This input should be filled with a date equal or before the Limit Date.')) + self.add_error('limit_date', _('This input should be filled with a date equal or after the Begin Date.')) - #if end_date and limit_date: - # if not end_date == ValueError and not limit_date == ValueError: - # if end_date > limit_date: - # self.add_error('end_date', _('This input should be filled with a date equal or before the Limit Date.')) - # self.add_error('limit_date', _('This input should be filled with a date equal or after the End Date.')) + if end_date and limit_date: + if not end_date == ValueError and not limit_date == ValueError: + if end_date > limit_date: + self.add_error('end_date', _('This input should be filled with a date equal or before the Limit Date.')) + self.add_error('limit_date', _('This input should be filled with a date equal or after the End Date.')) if subject_id: subject = Subject.objects.get(id = subject_id) @@ -173,14 +177,30 @@ class PendenciesLimitedForm(forms.ModelForm): 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.')) - #if not limit_date == ValueError and limit_date: - # if not self.instance.id and limit_date.date() < datetime.datetime.today().date(): - # self.add_error('limit_date', _("This input should be filled with a date equal or after today's date.")) + if not limit_date == ValueError and limit_date: + if not self.instance.id and limit_date.date() < datetime.datetime.today().date(): + self.add_error('limit_date', _("This input should be filled with a date equal or after today's date.")) - # if limit_date.date() < subject.init_date: - # self.add_error('limit_date', _('This input should be filled with a date equal or after the subject begin date.')) + if limit_date.date() < subject.init_date: + self.add_error('limit_date', _('This input should be filled with a date equal or after the subject begin date.')) + + if limit_date.date() > subject.end_date: + self.add_error('limit_date', _('This input should be filled with a date equal or before the subject end date.')) + + if limit_submission_date: + limit_submission_date = datetime.datetime.strptime(limit_submission_date, get_format('DATETIME_FORMAT')) + limit_submission_date = timezone.make_aware(limit_submission_date, timezone.get_current_timezone()) + + if not begin_date == ValueError and begin_date: + if begin_date > limit_submission_date: + self.add_error('begin_date', _('This input should be filled with a date equal or before the goals submission limit date.')) + + if not end_date == ValueError and end_date: + if end_date > limit_submission_date: + self.add_error('end_date', _('This input should be filled with a date equal or before the goals submission limit date.')) - # if limit_date.date() > subject.end_date: - # self.add_error('limit_date', _('This input should be filled with a date equal or before the subject end date.')) + if not limit_date == ValueError and limit_date: + if limit_date > limit_submission_date: + self.add_error('limit_date', _('This input should be filled with a date equal or before the goals submission limit date.')) return cleaned_data -- libgit2 0.21.2