Commit a53fdfc8598a198e5138857da58b18985f8d5caf

Authored by Zambom
1 parent 33390e61

Adjusting goals submit and adding my goals update

goals/models.py
@@ -19,7 +19,7 @@ class Goals(Resource): @@ -19,7 +19,7 @@ class Goals(Resource):
19 19
20 def access_link(self): 20 def access_link(self):
21 if self.show_window: 21 if self.show_window:
22 - return reverse_lazy('goals:window_view', args = (), kwargs = {'slug': self.slug}) 22 + return reverse_lazy('goals:window_submit', args = (), kwargs = {'slug': self.slug})
23 23
24 return reverse_lazy('goals:submit', args = (), kwargs = {'slug': self.slug}) 24 return reverse_lazy('goals:submit', args = (), kwargs = {'slug': self.slug})
25 25
goals/templates/goals/_form_submit.html 0 → 100644
@@ -0,0 +1,53 @@ @@ -0,0 +1,53 @@
  1 +{% load static i18n util_tags %}
  2 +{% load widget_tweaks %}
  3 +
  4 +<form id="mygoals_submit" method="post" action="" enctype="multipart/form-data">
  5 + {% csrf_token %}
  6 +
  7 + {{ my_goals_formset.management_form }}
  8 + {{ my_goals_formset.non_form_errors }}
  9 +
  10 + {% for form, item in my_goals_formset|zip:goals.item_goal.all %}
  11 + {% render_field form.id %}
  12 + {% render_field form.item %}
  13 + {{ form.errors }}
  14 +
  15 + {% if form.instance.pk %}{{ form.DELETE }}{% endif %}
  16 +
  17 + <div class="form-group{% if form.has_error %} has-error {% endif %} row goal_item">
  18 + <div class="col-md-12">
  19 + <h4>{% trans 'Goal' %} {{ item.order }}: {{ item.description }}</h4>
  20 + <p>{% trans 'Minimum percentage desired' %}: {{ item.ref_value }}%</p>
  21 + <br clear="all" />
  22 + <span class="label">0%</span>
  23 + {% with form.value.value|default:"0" as item_value %}
  24 + {% render_field form.value class='slider_value' data-slider-value=item_value data-slider-min="0" data-slider-max="100" %}
  25 + {% endwith %}
  26 + <span class="label">100%</span>
  27 + </div>
  28 +
  29 + <br clear="all" />
  30 +
  31 + <span id="helpBlock" class="help-block">{{ form.value.help_text }}</span>
  32 +
  33 + {% if form.value.errors %}
  34 + <div class="alert alert-danger alert-dismissible" role="alert">
  35 + <button type="button" class="close" data-dismiss="alert" aria-label="Close">
  36 + <span aria-hidden="true">&times;</span>
  37 + </button>
  38 + <ul>
  39 + {% for error in form.value.errors %}
  40 + <li>{{ error }}</li>
  41 + {% endfor %}
  42 + </ul>
  43 + </div>
  44 + {% endif %}
  45 + </div>
  46 + {% endfor %}
  47 +</form>
  48 +
  49 +<hr />
  50 +
  51 +<div class="text-center">
  52 + <button type="submit" form="mygoals_submit" class="btn btn-success btn-raised">{% trans 'Save' %}</a>
  53 +</div>
0 \ No newline at end of file 54 \ No newline at end of file
goals/templates/goals/submit.html
@@ -67,56 +67,7 @@ @@ -67,56 +67,7 @@
67 67
68 <hr class="goal_divider" /> 68 <hr class="goal_divider" />
69 69
70 - <form id="mygoals_submit" method="post" action="" enctype="multipart/form-data">  
71 - {% csrf_token %}  
72 -  
73 - {{ my_goals_formset.management_form }}  
74 - {{ my_goals_formset.non_form_errors }}  
75 -  
76 - {% for form, item in my_goals_formset|zip:goals.item_goal.all %}  
77 - {% render_field form.id %}  
78 - {% render_field form.item %}  
79 - {{ form.errors }}  
80 -  
81 - {% if form.instance.pk %}{{ form.DELETE }}{% endif %}  
82 -  
83 - <div class="form-group{% if form.has_error %} has-error {% endif %} row goal_item">  
84 - <div class="col-md-12">  
85 - <h4>{% trans 'Goal' %} {{ item.order }}: {{ item.description }}</h4>  
86 - <p>{% trans 'Minimum percentage desired' %}: {{ item.ref_value }}%</p>  
87 - <br clear="all" />  
88 - <span class="label">0%</span>  
89 - {% with form.value.value|default:"0" as item_value %}  
90 - {% render_field form.value class='slider_value' data-slider-value=item_value data-slider-min="0" data-slider-max="100" %}  
91 - {% endwith %}  
92 - <span class="label">100%</span>  
93 - </div>  
94 -  
95 - <br clear="all" />  
96 -  
97 - <span id="helpBlock" class="help-block">{{ form.value.help_text }}</span>  
98 -  
99 - {% if form.value.errors %}  
100 - <div class="alert alert-danger alert-dismissible" role="alert">  
101 - <button type="button" class="close" data-dismiss="alert" aria-label="Close">  
102 - <span aria-hidden="true">&times;</span>  
103 - </button>  
104 - <ul>  
105 - {% for error in form.value.errors %}  
106 - <li>{{ error }}</li>  
107 - {% endfor %}  
108 - </ul>  
109 - </div>  
110 - {% endif %}  
111 - </div>  
112 - {% endfor %}  
113 - </form>  
114 -  
115 - <hr />  
116 -  
117 - <div class="text-center">  
118 - <button type="submit" form="mygoals_submit" class="btn btn-success btn-raised">{% trans 'Save' %}</a>  
119 - </div> 70 + {% include "goals/_form_submit.html" %}
120 </div> 71 </div>
121 </div> 72 </div>
122 73
goals/templates/goals/update_submit.html 0 → 100644
@@ -0,0 +1,84 @@ @@ -0,0 +1,84 @@
  1 +{% extends 'subjects/view.html' %}
  2 +
  3 +{% load static i18n pagination permissions_tags subject_counter util_tags %}
  4 +{% load django_bootstrap_breadcrumbs %}
  5 +{% load widget_tweaks %}
  6 +
  7 +{% block style %}
  8 + {{block.super}}
  9 + <link rel="stylesheet" type="text/css" href="{% static "css/bootstrap-slider.css" %}">
  10 +{% endblock %}
  11 +
  12 +{% block javascript%}
  13 + {{ block.super }}
  14 + <script type="text/javascript" src="{% static "js/bootstrap-slider.js" %} "></script>
  15 +{% endblock%}
  16 +
  17 +{% block breadcrumbs %}
  18 + {{ block.super }}
  19 + {% breadcrumb topic 'subjects:topic_view' subject.slug topic.slug %}
  20 + {% breadcrumb goals 'goals:view' goals.slug %}
  21 +
  22 + {% trans 'Update My Goals' as bread %}
  23 + {% breadcrumb bread 'goals:update_submit' goals.slug %}
  24 +{% endblock %}
  25 +
  26 +{% block content %}
  27 + {% if messages %}
  28 + {% for message in messages %}
  29 + <div class="alert alert-{{ message.tags }} alert-dismissible" role="alert">
  30 + <button type="button" class="close" data-dismiss="alert" aria-label="Close">
  31 + <span aria-hidden="true">&times;</span>
  32 + </button>
  33 + <p>{{ message }}</p>
  34 + </div>
  35 + {% endfor %}
  36 + {% endif %}
  37 +
  38 + {% resource_permissions request.user goals as has_resource_permissions %}
  39 +
  40 + {% if goals.visible %}
  41 + <div class="panel panel-info topic-panel">
  42 + <div class="panel-heading">
  43 + {% elif has_resource_permissions %}
  44 + <div class="panel panel-info topic-panel-invisible">
  45 + <div class="panel-heading panel-invisible">
  46 + {% endif %}
  47 + <div class="row">
  48 + <div class="col-md-12 category-header">
  49 + <h4 class="panel-title" style="margin-top: 10px; margin-bottom: 8px">
  50 + <span>{{ goals }}</span>
  51 + </h4>
  52 +
  53 + <div class="col-md-5 pull-right category-card-items">
  54 + <a href="{% url 'mural:resource_view' goals.slug %}" class="pull-right action_icon">
  55 + <i class="fa fa-list" aria-hidden="true"></i>
  56 + {% resource_mural_number goals request.user %}
  57 + </a>
  58 + </div>
  59 + </div>
  60 + </div>
  61 + </div>
  62 + <div id="{{subject.slug}}" class="panel-collapse in collapse category-panel-content">
  63 + {% autoescape off %}
  64 + {{ goals.presentation }}
  65 + {% endautoescape %}
  66 +
  67 + <br clear="all" />
  68 +
  69 + <b>{% trans "Limit submission date" %}:</b> {{ goals.limit_submission_date }}
  70 +
  71 + <hr class="goal_divider" />
  72 +
  73 + {% include "goals/_form_submit.html" %}
  74 + </div>
  75 + </div>
  76 +
  77 + <script type="text/javascript">
  78 + $(function () {
  79 + $(".slider_value").bootstrapSlider({
  80 + tooltip: 'always',
  81 + });
  82 + });
  83 + </script>
  84 +{% endblock %}
goals/templates/goals/view.html
@@ -80,7 +80,7 @@ @@ -80,7 +80,7 @@
80 <hr /> 80 <hr />
81 81
82 <div class="text-center"> 82 <div class="text-center">
83 - <a href="#" class="btn btn-success btn-raised">{% trans 'Update Goals' %}</a> 83 + <a href="{% url 'goals:update_submit' goal.slug %}" class="btn btn-success btn-raised">{% trans 'Update Goals' %}</a>
84 </div> 84 </div>
85 </div> 85 </div>
86 </div> 86 </div>
goals/templates/goals/window_submit.html 0 → 100644
@@ -0,0 +1,55 @@ @@ -0,0 +1,55 @@
  1 +<!DOCTYPE html>
  2 +
  3 +{% load static i18n util_tags %}
  4 +{% load widget_tweaks %}
  5 +
  6 +<html>
  7 +<head>
  8 + <title>{{ title }} | {{ theme.title }}</title>
  9 +
  10 + <script type="text/javascript" src="{% static 'js/jquery-3.1.0.min.js' %}"></script>
  11 +
  12 + <meta http-equiv="Cache-Control" content="no-cache, no-store" />
  13 + <link href="{{ theme.favicon_url }}" rel="shortcut icon" />
  14 +
  15 + <link rel="stylesheet" type="text/css" href="{% static 'bootstrap-3.3.7/css/bootstrap.css' %}">
  16 + <link rel="stylesheet" type="text/css" href="{% static 'material/css/bootstrap-material-design.min.css' %}">
  17 + <link rel="stylesheet" type="text/css" href="{% static 'material/css/ripples.css' %}">
  18 + <link rel="stylesheet" type="text/css" href="{% static 'material/css/ripples.min.css' %}">
  19 + <link rel="stylesheet" type="text/css" href="{% static 'css/bootstrap-slider.css' %}">
  20 + <link rel="stylesheet" type="text/css" href="{% static 'font-awesome-4.6.3/css/font-awesome.min.css' %}">
  21 +
  22 + <!-- Custom styles -->
  23 + <link rel="stylesheet" type="text/css" href="{% static 'css/base/amadeus_responsive.css' %}">
  24 + <link rel="stylesheet" type="text/css" href="{% static 'css/base/amadeus.css' %}">
  25 +
  26 + {% with 'css/themes/'|add:theme.css_style|add:'.css' as theme_selected %}
  27 + <link rel="stylesheet" type="text/css" href="{% static theme_selected %}">
  28 + {% endwith %}
  29 +
  30 + <script type="text/javascript" src="{% static 'js/bootstrap-slider.js' %} "></script>
  31 +</head>
  32 +<body style="background: #FFF">
  33 + <div class="container-fluid" style="padding-top: 20px">
  34 + {% autoescape off %}
  35 + {{ goals.presentation }}
  36 + {% endautoescape %}
  37 +
  38 + <br clear="all" />
  39 +
  40 + <b>{% trans "Limit submission date" %}:</b> {{ goals.limit_submission_date }}
  41 +
  42 + <hr class="goal_divider" />
  43 +
  44 + {% include "goals/_form_submit.html" %}
  45 + </div>
  46 +
  47 +<script type="text/javascript">
  48 + $(function () {
  49 + $(".slider_value").bootstrapSlider({
  50 + tooltip: 'always',
  51 + });
  52 + });
  53 +</script>
  54 +</body>
  55 +</html>
0 \ No newline at end of file 56 \ No newline at end of file
goals/templates/goals/window_view.html
@@ -1,72 +0,0 @@ @@ -1,72 +0,0 @@
1 -<!DOCTYPE html>  
2 -  
3 -{% load static i18n %}  
4 -  
5 -<html>  
6 -<head>  
7 - <title>{{ title }} | {{ theme.title }}</title>  
8 -  
9 - <script type="text/javascript" src="{% static 'js/jquery-3.1.0.min.js' %}"></script>  
10 -  
11 - <meta http-equiv="Cache-Control" content="no-cache, no-store" />  
12 - <link href="{{ theme.favicon_url }}" rel="shortcut icon" />  
13 -  
14 - <link rel="stylesheet" type="text/css" href="{% static 'bootstrap-3.3.7/css/bootstrap.css' %}">  
15 - <link rel="stylesheet" type="text/css" href="{% static 'material/css/bootstrap-material-design.min.css' %}">  
16 - <link rel="stylesheet" type="text/css" href="{% static 'material/css/ripples.css' %}">  
17 - <link rel="stylesheet" type="text/css" href="{% static 'material/css/ripples.min.css' %}">  
18 - <link rel="stylesheet" type="text/css" href="{% static 'css/bootstrap-slider.css' %}">  
19 - <link rel="stylesheet" type="text/css" href="{% static 'font-awesome-4.6.3/css/font-awesome.min.css' %}">  
20 -  
21 - <!-- Custom styles -->  
22 - <link rel="stylesheet" type="text/css" href="{% static 'css/base/amadeus_responsive.css' %}">  
23 - <link rel="stylesheet" type="text/css" href="{% static 'css/base/amadeus.css' %}">  
24 -  
25 - {% with 'css/themes/'|add:theme.css_style|add:'.css' as theme_selected %}  
26 - <link rel="stylesheet" type="text/css" href="{% static theme_selected %}">  
27 - {% endwith %}  
28 -  
29 - <script type="text/javascript" src="{% static 'js/bootstrap-slider.js' %} "></script>  
30 -</head>  
31 -<body style="background: #FFF">  
32 - <div class="container-fluid" style="padding-top: 20px">  
33 - {% autoescape off %}  
34 - {{ goals.presentation }}  
35 - {% endautoescape %}  
36 -  
37 - <br clear="all" />  
38 -  
39 - <b>{% trans "Limit submission date" %}:</b> {{ goals.limit_submission_date }}  
40 -  
41 - <hr class="goal_divider" />  
42 -  
43 - {% for item in goals.item_goal.all %}  
44 - <div class="row goal_item">  
45 - <div class="col-md-12">  
46 - <h4>{% trans 'Goal' %} {{ item.order }}: {{ item.description }}</h4>  
47 - <p>{% trans 'Minimum percentage desired' %}: {{ item.ref_value }}%</p>  
48 - <br clear="all" />  
49 - <span class="label">0%</span>  
50 - <input type="text" class="slider_value" value="{{ item.ref_value }}" data-slider-value="{{ item.ref_value }}" data-slider-min="0" data-slider-max="100" />  
51 - <span class="label">100%</span>  
52 - </div>  
53 - </div>  
54 - {% endfor %}  
55 -  
56 - <hr />  
57 -  
58 - <div class="text-center">  
59 - <a href="#" class="btn btn-success btn-raised">{% trans 'Save' %}</a>  
60 - </div>  
61 - </div>  
62 -  
63 -<script type="text/javascript">  
64 - $(function () {  
65 - $(".slider_value").bootstrapSlider({  
66 - tooltip: 'always',  
67 - enabled: false  
68 - });  
69 - });  
70 -</script>  
71 -</body>  
72 -</html>  
73 \ No newline at end of file 0 \ No newline at end of file
@@ -7,7 +7,8 @@ urlpatterns = [ @@ -7,7 +7,8 @@ urlpatterns = [
7 url(r'^create/(?P<slug>[\w_-]+)/$', views.CreateView.as_view(), name = 'create'), 7 url(r'^create/(?P<slug>[\w_-]+)/$', views.CreateView.as_view(), name = 'create'),
8 url(r'^update/(?P<topic_slug>[\w_-]+)/(?P<slug>[\w_-]+)/$', views.UpdateView.as_view(), name = 'update'), 8 url(r'^update/(?P<topic_slug>[\w_-]+)/(?P<slug>[\w_-]+)/$', views.UpdateView.as_view(), name = 'update'),
9 url(r'^delete/(?P<slug>[\w_-]+)/$', views.DeleteView.as_view(), name = 'delete'), 9 url(r'^delete/(?P<slug>[\w_-]+)/$', views.DeleteView.as_view(), name = 'delete'),
10 - url(r'^window_view/(?P<slug>[\w_-]+)/$', views.NewWindowView.as_view(), name = 'window_view'), 10 + url(r'^window_submit/(?P<slug>[\w_-]+)/$', views.NewWindowSubmit.as_view(), name = 'window_submit'),
11 url(r'^view/(?P<slug>[\w_-]+)/$', views.InsideView.as_view(), name = 'view'), 11 url(r'^view/(?P<slug>[\w_-]+)/$', views.InsideView.as_view(), name = 'view'),
12 url(r'^submit/(?P<slug>[\w_-]+)/$', views.SubmitView.as_view(), name = 'submit'), 12 url(r'^submit/(?P<slug>[\w_-]+)/$', views.SubmitView.as_view(), name = 'submit'),
  13 + url(r'^update_submit/(?P<slug>[\w_-]+)/$', views.UpdateSubmit.as_view(), name = 'update_submit'),
13 ] 14 ]
goals/views.py
@@ -4,7 +4,7 @@ from django.contrib import messages @@ -4,7 +4,7 @@ from django.contrib import messages
4 from django.core.urlresolvers import reverse, reverse_lazy 4 from django.core.urlresolvers import reverse, reverse_lazy
5 from django.utils.translation import ugettext_lazy as _ 5 from django.utils.translation import ugettext_lazy as _
6 from django.contrib.auth.mixins import LoginRequiredMixin 6 from django.contrib.auth.mixins import LoginRequiredMixin
7 -from django.forms import formset_factory 7 +from django.forms import formset_factory, modelformset_factory
8 8
9 from amadeus.permissions import has_subject_permissions, has_resource_permissions 9 from amadeus.permissions import has_subject_permissions, has_resource_permissions
10 10
@@ -13,30 +13,6 @@ from topics.models import Topic @@ -13,30 +13,6 @@ from topics.models import Topic
13 from .forms import GoalsForm, MyGoalsForm, InlinePendenciesFormset, InlineGoalItemFormset 13 from .forms import GoalsForm, MyGoalsForm, InlinePendenciesFormset, InlineGoalItemFormset
14 from .models import Goals, MyGoals 14 from .models import Goals, MyGoals
15 15
16 -class NewWindowView(LoginRequiredMixin, generic.DetailView):  
17 - login_url = reverse_lazy("users:login")  
18 - redirect_field_name = 'next'  
19 -  
20 - template_name = 'goals/window_view.html'  
21 - model = Goals  
22 - context_object_name = 'goals'  
23 -  
24 - def dispatch(self, request, *args, **kwargs):  
25 - slug = self.kwargs.get('slug', '')  
26 - goals = get_object_or_404(Goals, slug = slug)  
27 -  
28 - if not has_resource_permissions(request.user, goals):  
29 - return redirect(reverse_lazy('subjects:home'))  
30 -  
31 - return super(NewWindowView, self).dispatch(request, *args, **kwargs)  
32 -  
33 - def get_context_data(self, **kwargs):  
34 - context = super(NewWindowView, self).get_context_data(**kwargs)  
35 -  
36 - context['title'] = (self.object.name)  
37 -  
38 - return context  
39 -  
40 class InsideView(LoginRequiredMixin, generic.ListView): 16 class InsideView(LoginRequiredMixin, generic.ListView):
41 login_url = reverse_lazy("users:login") 17 login_url = reverse_lazy("users:login")
42 redirect_field_name = 'next' 18 redirect_field_name = 'next'
@@ -76,6 +52,90 @@ class InsideView(LoginRequiredMixin, generic.ListView): @@ -76,6 +52,90 @@ class InsideView(LoginRequiredMixin, generic.ListView):
76 52
77 return context 53 return context
78 54
  55 +class NewWindowSubmit(LoginRequiredMixin, generic.edit.CreateView):
  56 + login_url = reverse_lazy("users:login")
  57 + redirect_field_name = 'next'
  58 +
  59 + template_name = 'goals/window_submit.html'
  60 + form_class = MyGoalsForm
  61 +
  62 + def dispatch(self, request, *args, **kwargs):
  63 + slug = self.kwargs.get('slug', '')
  64 + goals = get_object_or_404(Goals, slug = slug)
  65 +
  66 + if not has_resource_permissions(request.user, goals):
  67 + return redirect(reverse_lazy('subjects:home'))
  68 +
  69 + if MyGoals.objects.filter(item__goal = goals, user = request.user).exists():
  70 + return redirect(reverse_lazy('goals:view', args = (), kwargs = {'slug': slug}))
  71 +
  72 + return super(NewWindowSubmit, self).dispatch(request, *args, **kwargs)
  73 +
  74 + def get(self, request, *args, **kwargs):
  75 + self.object = None
  76 +
  77 + form_class = self.get_form_class()
  78 + form = self.get_form(form_class)
  79 +
  80 + slug = self.kwargs.get('slug', '')
  81 + goals = get_object_or_404(Goals, slug = slug)
  82 +
  83 + MyGoalsFormset = formset_factory(MyGoalsForm, extra = 0)
  84 + my_goals_formset = MyGoalsFormset(initial = [{'item': x.id, 'value': x.ref_value} for x in goals.item_goal.all()])
  85 +
  86 + return self.render_to_response(self.get_context_data(my_goals_formset = my_goals_formset))
  87 +
  88 + def post(self, request, *args, **kwargs):
  89 + self.object = None
  90 +
  91 + form_class = self.get_form_class()
  92 + form = self.get_form(form_class)
  93 +
  94 + slug = self.kwargs.get('slug', '')
  95 + goals = get_object_or_404(Goals, slug = slug)
  96 +
  97 + MyGoalsFormset = formset_factory(MyGoalsForm, extra = 0)
  98 + my_goals_formset = MyGoalsFormset(self.request.POST, initial = [{'item': x.id, 'value': x.ref_value} for x in goals.item_goal.all()])
  99 +
  100 + if (my_goals_formset.is_valid()):
  101 + return self.form_valid(my_goals_formset)
  102 + else:
  103 + return self.form_invalid(my_goals_formset)
  104 +
  105 + def form_invalid(self, my_goals_formset):
  106 + return self.render_to_response(self.get_context_data(my_goals_formset = my_goals_formset))
  107 +
  108 + def form_valid(self, my_goals_formset):
  109 + for forms in my_goals_formset.forms:
  110 + form = forms.save(commit = False)
  111 + form.user = self.request.user
  112 +
  113 + form.save()
  114 +
  115 + return redirect(self.get_success_url())
  116 +
  117 + def get_context_data(self, **kwargs):
  118 + context = super(NewWindowSubmit, self).get_context_data(**kwargs)
  119 +
  120 + slug = self.kwargs.get('slug', '')
  121 + goals = get_object_or_404(Goals, slug = slug)
  122 +
  123 + context['title'] = goals.name
  124 +
  125 + context['goals'] = goals
  126 +
  127 + return context
  128 +
  129 + def get_success_url(self):
  130 + slug = self.kwargs.get('slug', '')
  131 + goals = get_object_or_404(Goals, slug = slug)
  132 +
  133 + messages.success(self.request, _('Your goals for %s was save successfully!')%(goals.topic.name))
  134 +
  135 + success_url = reverse_lazy('goals:view', kwargs = {'slug': slug})
  136 +
  137 + return success_url
  138 +
79 class SubmitView(LoginRequiredMixin, generic.edit.CreateView): 139 class SubmitView(LoginRequiredMixin, generic.edit.CreateView):
80 login_url = reverse_lazy("users:login") 140 login_url = reverse_lazy("users:login")
81 redirect_field_name = 'next' 141 redirect_field_name = 'next'
@@ -90,6 +150,9 @@ class SubmitView(LoginRequiredMixin, generic.edit.CreateView): @@ -90,6 +150,9 @@ class SubmitView(LoginRequiredMixin, generic.edit.CreateView):
90 if not has_resource_permissions(request.user, goals): 150 if not has_resource_permissions(request.user, goals):
91 return redirect(reverse_lazy('subjects:home')) 151 return redirect(reverse_lazy('subjects:home'))
92 152
  153 + if MyGoals.objects.filter(item__goal = goals, user = request.user).exists():
  154 + return redirect(reverse_lazy('goals:view', args = (), kwargs = {'slug': slug}))
  155 +
93 return super(SubmitView, self).dispatch(request, *args, **kwargs) 156 return super(SubmitView, self).dispatch(request, *args, **kwargs)
94 157
95 def get(self, request, *args, **kwargs): 158 def get(self, request, *args, **kwargs):
@@ -159,6 +222,94 @@ class SubmitView(LoginRequiredMixin, generic.edit.CreateView): @@ -159,6 +222,94 @@ class SubmitView(LoginRequiredMixin, generic.edit.CreateView):
159 222
160 return success_url 223 return success_url
161 224
  225 +class UpdateSubmit(LoginRequiredMixin, generic.UpdateView):
  226 + login_url = reverse_lazy("users:login")
  227 + redirect_field_name = 'next'
  228 +
  229 + template_name = 'goals/submit.html'
  230 + form_class = MyGoalsForm
  231 +
  232 + def get_object(self, queryset = None):
  233 + slug = self.kwargs.get('slug', '')
  234 + goals = get_object_or_404(Goals, slug = slug)
  235 +
  236 + return MyGoals.objects.filter(item__goal = goals, user = self.request.user)[0]
  237 +
  238 + def dispatch(self, request, *args, **kwargs):
  239 + slug = self.kwargs.get('slug', '')
  240 + goals = get_object_or_404(Goals, slug = slug)
  241 +
  242 + if not has_resource_permissions(request.user, goals):
  243 + return redirect(reverse_lazy('subjects:home'))
  244 +
  245 + return super(UpdateSubmit, self).dispatch(request, *args, **kwargs)
  246 +
  247 + def get(self, request, *args, **kwargs):
  248 + self.object = self.get_object()
  249 +
  250 + form_class = self.get_form_class()
  251 + form = self.get_form(form_class)
  252 +
  253 + slug = self.kwargs.get('slug', '')
  254 + goals = get_object_or_404(Goals, slug = slug)
  255 +
  256 + MyGoalsFormset = modelformset_factory(MyGoals, form = MyGoalsForm, extra = 0)
  257 + my_goals_formset = MyGoalsFormset()
  258 +
  259 + return self.render_to_response(self.get_context_data(my_goals_formset = my_goals_formset))
  260 +
  261 + def post(self, request, *args, **kwargs):
  262 + self.object = self.get_object()
  263 +
  264 + form_class = self.get_form_class()
  265 + form = self.get_form(form_class)
  266 +
  267 + slug = self.kwargs.get('slug', '')
  268 + goals = get_object_or_404(Goals, slug = slug)
  269 +
  270 + MyGoalsFormset = modelformset_factory(MyGoals, form = MyGoalsForm, extra = 0)
  271 + my_goals_formset = MyGoalsFormset(self.request.POST)
  272 +
  273 + if (my_goals_formset.is_valid()):
  274 + return self.form_valid(my_goals_formset)
  275 + else:
  276 + return self.form_invalid(my_goals_formset)
  277 +
  278 + def form_invalid(self, my_goals_formset):
  279 + return self.render_to_response(self.get_context_data(my_goals_formset = my_goals_formset))
  280 +
  281 + def form_valid(self, my_goals_formset):
  282 + for forms in my_goals_formset.forms:
  283 + form = forms.save(commit = False)
  284 +
  285 + form.save()
  286 +
  287 + return redirect(self.get_success_url())
  288 +
  289 + def get_context_data(self, **kwargs):
  290 + context = super(UpdateSubmit, self).get_context_data(**kwargs)
  291 +
  292 + slug = self.kwargs.get('slug', '')
  293 + goals = get_object_or_404(Goals, slug = slug)
  294 +
  295 + context['title'] = goals.name
  296 +
  297 + context['goals'] = goals
  298 + context['topic'] = goals.topic
  299 + context['subject'] = goals.topic.subject
  300 +
  301 + return context
  302 +
  303 + def get_success_url(self):
  304 + slug = self.kwargs.get('slug', '')
  305 + goals = get_object_or_404(Goals, slug = slug)
  306 +
  307 + messages.success(self.request, _('Your goals for %s was update successfully!')%(goals.topic.name))
  308 +
  309 + success_url = reverse_lazy('goals:view', kwargs = {'slug': slug})
  310 +
  311 + return success_url
  312 +
162 class CreateView(LoginRequiredMixin, generic.edit.CreateView): 313 class CreateView(LoginRequiredMixin, generic.edit.CreateView):
163 login_url = reverse_lazy("users:login") 314 login_url = reverse_lazy("users:login")
164 redirect_field_name = 'next' 315 redirect_field_name = 'next'
@@ -285,7 +436,7 @@ class CreateView(LoginRequiredMixin, generic.edit.CreateView): @@ -285,7 +436,7 @@ class CreateView(LoginRequiredMixin, generic.edit.CreateView):
285 if self.object.show_window: 436 if self.object.show_window:
286 self.request.session['resources'] = {} 437 self.request.session['resources'] = {}
287 self.request.session['resources']['new_page'] = True 438 self.request.session['resources']['new_page'] = True
288 - self.request.session['resources']['new_page_url'] = reverse('goals:window_view', kwargs = {'slug': self.object.slug}) 439 + self.request.session['resources']['new_page_url'] = reverse('goals:window_submit', kwargs = {'slug': self.object.slug})
289 440
290 success_url = reverse_lazy('subjects:view', kwargs = {'slug': self.object.topic.subject.slug}) 441 success_url = reverse_lazy('subjects:view', kwargs = {'slug': self.object.topic.subject.slug})
291 442
@@ -400,7 +551,7 @@ class UpdateView(LoginRequiredMixin, generic.UpdateView): @@ -400,7 +551,7 @@ class UpdateView(LoginRequiredMixin, generic.UpdateView):
400 if self.object.show_window: 551 if self.object.show_window:
401 self.request.session['resources'] = {} 552 self.request.session['resources'] = {}
402 self.request.session['resources']['new_page'] = True 553 self.request.session['resources']['new_page'] = True
403 - self.request.session['resources']['new_page_url'] = reverse('goals:window_view', kwargs = {'slug': self.object.slug}) 554 + self.request.session['resources']['new_page_url'] = reverse('goals:window_submit', kwargs = {'slug': self.object.slug})
404 555
405 success_url = reverse_lazy('subjects:view', kwargs = {'slug': self.object.topic.subject.slug}) 556 success_url = reverse_lazy('subjects:view', kwargs = {'slug': self.object.topic.subject.slug})
406 557