Commit d44d52e59ca8d146f68961c38e09532d4c46ba69
1 parent
3e13bc79
Exists in
master
and in
39 other branches
Merging
Showing
9 changed files
with
200 additions
and
266 deletions
Show diff stats
src/accounts/forms.py
@@ -2,7 +2,6 @@ | @@ -2,7 +2,6 @@ | ||
2 | 2 | ||
3 | from django import forms | 3 | from django import forms |
4 | from django.contrib.auth import get_user_model | 4 | from django.contrib.auth import get_user_model |
5 | -from django.contrib.auth.forms import UserCreationForm as UserCreationForm_ | ||
6 | from django.utils.translation import ugettext_lazy as _ | 5 | from django.utils.translation import ugettext_lazy as _ |
7 | 6 | ||
8 | from super_archives.models import MailingList | 7 | from super_archives.models import MailingList |
src/accounts/templates/accounts/signup-form.html
@@ -1,76 +0,0 @@ | @@ -1,76 +0,0 @@ | ||
1 | -{% extends "base.html" %} | ||
2 | -{% load form_field %} | ||
3 | -{% load i18n %} | ||
4 | -{% block main-content %} | ||
5 | - | ||
6 | -<h2>{% trans "Sign up" %}</h2> | ||
7 | - | ||
8 | -<div class="row"> | ||
9 | - {% if form.errors %} | ||
10 | - <div class="alert alert-danger"> | ||
11 | - <b>{% trans "Please correct the errors below and try again" %}</b> | ||
12 | - </div> | ||
13 | - {% endif %} | ||
14 | - | ||
15 | - <div> | ||
16 | - {% for field in form %} | ||
17 | - {% if field.errors %} | ||
18 | - {{ field.label }} | ||
19 | - {% endif %} | ||
20 | - {% endfor %} | ||
21 | - </div> | ||
22 | -</div> | ||
23 | - | ||
24 | - | ||
25 | -<p class="required"> | ||
26 | - <label>{% trans "Required fields" %}</label> | ||
27 | -</p> | ||
28 | - | ||
29 | -<form action="." method="post" role="form" class="form-horizontal signup"> | ||
30 | - {% csrf_token %} | ||
31 | - | ||
32 | - <div class="row"> | ||
33 | - | ||
34 | - <div> | ||
35 | - {% for legend, fields in fieldsets %} | ||
36 | - <div class="col-md-6 col-lg-6 col-sm-6 col-xs-12" style="display: inline-block; vertical-align:top;"> | ||
37 | - <div class="well"> | ||
38 | - <fieldset> | ||
39 | - <legend>{{ legend }}</legend> | ||
40 | - {% for field in fields %} | ||
41 | - <div class="form-group{% if field.field.required %} required{% endif %}{% if field.errors %} alert alert-danger has-error{% endif %}"> | ||
42 | - <label for="first_name" class="control-label"> | ||
43 | - {{ field.label }} | ||
44 | - </label> | ||
45 | - {% if field.name == 'username' %} | ||
46 | - <input id="id_username" name="username" type="text" class="form-control"> | ||
47 | - {% elif field.name == 'lists' %} | ||
48 | - {% for choice in field %} | ||
49 | - <div class="checkbox"> | ||
50 | - {{ choice }} | ||
51 | - </div> | ||
52 | - {% endfor %} | ||
53 | - {% else %} | ||
54 | - {{ field }} | ||
55 | - {% endif %} | ||
56 | - {{ field.errors }} | ||
57 | - </div> | ||
58 | - | ||
59 | - {% endfor %} | ||
60 | - </fieldset> | ||
61 | - </div> | ||
62 | - </div> | ||
63 | - {% endfor %} | ||
64 | - | ||
65 | - </div> | ||
66 | - </div> | ||
67 | - | ||
68 | - <div class="row"> | ||
69 | - <div class="submit"> | ||
70 | - <input type="submit" value="{% trans 'Register' %}" class="btn btn-primary btn-lg btn-block"> | ||
71 | - </div> | ||
72 | - </div> | ||
73 | - | ||
74 | -</form> | ||
75 | - | ||
76 | -{% endblock %} |
src/accounts/templates/accounts/user-profile.html
@@ -1,101 +0,0 @@ | @@ -1,101 +0,0 @@ | ||
1 | -{% extends "base.html" %} | ||
2 | -{% load i18n form_field gravatar %} | ||
3 | - | ||
4 | -{% block head_js %} | ||
5 | - {% include "pizza-chart.html" with chart_div="collabs" chart_height=300 %} | ||
6 | - {% include "pizza-chart.html" with chart_div="collabs2" chart_height=300 %} | ||
7 | -{% endblock %} | ||
8 | - | ||
9 | -{% block main-content %} | ||
10 | - | ||
11 | - <div id="user-profile" class="row"> | ||
12 | - <div class="vcard col-lg-3 col-md-3 col-sm-4"> | ||
13 | - <div class="thumbnail"> | ||
14 | - {% gravatar user_.email 200 %} | ||
15 | - </div> | ||
16 | - | ||
17 | - <h1> | ||
18 | - <span>{{ user_.get_full_name }}</span> | ||
19 | - <em>{{ user_.username }}</em> | ||
20 | - </h1> | ||
21 | - | ||
22 | - {% ifequal request.user user_ %} | ||
23 | - <a class="btn btn-info" href="{% url 'user_profile_update' user_ %}"><span class="glyphicon glyphicon-pencil"></span> {% trans "update your profile"|title %}</a> | ||
24 | - {% endifequal %} | ||
25 | - | ||
26 | - <div class="divider"></div> | ||
27 | - | ||
28 | - <ul class="unstyled-list"> | ||
29 | - {% if user_.institution or user_.role %} | ||
30 | - <li> | ||
31 | - <span class="icon-briefcase icon-fixed-width"></span> | ||
32 | - {{ user_.role }} | ||
33 | - {% if user_.institution and user_.role %}-{% endif %} | ||
34 | - {{ user_.institution }} | ||
35 | - </li> | ||
36 | - {% endif %} | ||
37 | - {% if user_.twitter %} | ||
38 | - <li><span class="icon-twitter icon-fixed-width"></span> {{ user_.twitter }}</li> | ||
39 | - {% endif %} | ||
40 | - {% if user_.facebook %} | ||
41 | - <li><span class="icon-facebook icon-fixed-width"></span> {{ user_.facebook }}</li> | ||
42 | - {% endif %} | ||
43 | - {% if user_.google_talk %} | ||
44 | - <li><span class="icon-google-plus icon-fixed-width"></span> {{ user_.google_talk }}</li> | ||
45 | - {% endif %} | ||
46 | - {% if user_.webpage %} | ||
47 | - <li><span class="icon-link icon-fixed-width"></span> {{ user_.webpage }}</li> | ||
48 | - {% endif %} | ||
49 | - </ul> | ||
50 | - </div> | ||
51 | - | ||
52 | - <div class="col-lg-5 col-md-5 col-sm-8"> | ||
53 | - <div class="panel panel-default"> | ||
54 | - <div class="panel-heading"> | ||
55 | - <h3 class="panel-title">{% trans "Contributions by Area" %}</h3> | ||
56 | - </div> | ||
57 | - <div class="panel-body"> | ||
58 | - <div id="collabs"></div> | ||
59 | - </div> | ||
60 | - </div> | ||
61 | - </div> | ||
62 | - | ||
63 | - | ||
64 | - <div class="col-lg-4 col-md-4 col-sm-8"> | ||
65 | - <div class="panel panel-default"> | ||
66 | - <div class="panel-heading"> | ||
67 | - <h3 class="panel-title">{% trans "Mailing list Participation" %}</h3> | ||
68 | - </div> | ||
69 | - <div class="panel-body"> | ||
70 | - <div id="collabs2"></div> | ||
71 | - </div> | ||
72 | - </div> | ||
73 | - </div> | ||
74 | - | ||
75 | - </div> | ||
76 | - <div class="row"> | ||
77 | - <div class="col-lg-6 col-md-6 col-sm-12"> | ||
78 | - <h3>{% trans "Latest posted" %} </h3> | ||
79 | - <ul class="message-list"> | ||
80 | - {% for doc in emails %} | ||
81 | - {% include "message-preview.html" %} | ||
82 | - {% empty %} | ||
83 | - <li>{% trans "There are no posts by this user so far." %}</li> | ||
84 | - {% endfor %} | ||
85 | - </ul> | ||
86 | - </div> | ||
87 | - | ||
88 | - <div class="col-lg-6 col-md-6 col-sm-12"> | ||
89 | - <h3>{% trans "Community inside participations" %}</h3> | ||
90 | - <ul class="message-list"> | ||
91 | - {% for doc in docs %} | ||
92 | - {% include "message-preview.html" %} | ||
93 | - {% empty %} | ||
94 | - <li>{% trans "No contributions of this user so far." %}</li> | ||
95 | - {% endfor %} | ||
96 | - </ul> | ||
97 | - </div> | ||
98 | - | ||
99 | - </div> | ||
100 | - | ||
101 | -{% endblock %} |
@@ -0,0 +1,67 @@ | @@ -0,0 +1,67 @@ | ||
1 | +{% extends "base.html" %} | ||
2 | +{% load form_field %} | ||
3 | +{% load i18n %} | ||
4 | +{% block main-content %} | ||
5 | + | ||
6 | +<h2>{% trans "Sign up" %}</h2> | ||
7 | + | ||
8 | +<div class="row"> | ||
9 | + {% if form.errors %} | ||
10 | + <div class="alert alert-danger"> | ||
11 | + <b>{% trans "Please correct the errors below and try again" %}</b> | ||
12 | + </div> | ||
13 | + {% endif %} | ||
14 | +</div> | ||
15 | + | ||
16 | + | ||
17 | +<p class="required"> | ||
18 | + <label>{% trans "Required fields" %}</label> | ||
19 | +</p> | ||
20 | + | ||
21 | +<form action="." method="post" role="form" class="form-horizontal signup"> | ||
22 | + {% csrf_token %} | ||
23 | + | ||
24 | + <div class="row"> | ||
25 | + | ||
26 | + <div> | ||
27 | + <div class="col-md-6 col-lg-6 col-sm-6 col-xs-12" style="display: inline-block; vertical-align:top;"> | ||
28 | + <div class="well"> | ||
29 | + <fieldset> | ||
30 | + <legend>{% trans 'Personal Information' %}</legend> | ||
31 | + {% for field in user_form %} | ||
32 | + <div class="form-group{% if field.field.required %} required{% endif %}{% if field.errors %} alert alert-danger has-error{% endif %}"> | ||
33 | + <label for="first_name" class="control-label"> | ||
34 | + {{ field.label }} | ||
35 | + </label> | ||
36 | + {{ field }} | ||
37 | + {{ field.errors }} | ||
38 | + </div> | ||
39 | + {% endfor %} | ||
40 | + </fieldset> | ||
41 | + </div> | ||
42 | + </div> | ||
43 | + | ||
44 | + <div class="col-md-6 col-lg-6 col-sm-6 col-xs-12" style="display: inline-block; vertical-align:top;"> | ||
45 | + <div class="well"> | ||
46 | + <fieldset> | ||
47 | + <legend>{% trans 'Subscribe to mail lists' %}</legend> | ||
48 | + {% for choice in lists_form.lists %} | ||
49 | + <div class="checkbox">{{ choice }}</div> | ||
50 | + {% endfor %} | ||
51 | + {{ lists_form.errors }} | ||
52 | + </fieldset> | ||
53 | + </div> | ||
54 | + </div> | ||
55 | + | ||
56 | + </div> | ||
57 | + </div> | ||
58 | + | ||
59 | + <div class="row"> | ||
60 | + <div class="submit"> | ||
61 | + <input type="submit" value="{% trans 'Register' %}" class="btn btn-primary btn-lg btn-block"> | ||
62 | + </div> | ||
63 | + </div> | ||
64 | + | ||
65 | +</form> | ||
66 | + | ||
67 | +{% endblock %} |
@@ -0,0 +1,101 @@ | @@ -0,0 +1,101 @@ | ||
1 | +{% extends "base.html" %} | ||
2 | +{% load i18n gravatar %} | ||
3 | + | ||
4 | +{% block head_js %} | ||
5 | + {% include "pizza-chart.html" with chart_div="collabs" chart_height=300 %} | ||
6 | + {% include "pizza-chart.html" with chart_div="collabs2" chart_height=300 %} | ||
7 | +{% endblock %} | ||
8 | + | ||
9 | +{% block main-content %} | ||
10 | + | ||
11 | + <div id="user-profile" class="row"> | ||
12 | + <div class="vcard col-lg-3 col-md-3 col-sm-4"> | ||
13 | + <div class="thumbnail"> | ||
14 | + {% gravatar user_.email 200 %} | ||
15 | + </div> | ||
16 | + | ||
17 | + <h1> | ||
18 | + <span>{{ user_.get_full_name }}</span> | ||
19 | + <em>{{ user_.username }}</em> | ||
20 | + </h1> | ||
21 | + | ||
22 | + {% ifequal request.user user_ %} | ||
23 | + <a class="btn btn-info" href="{% url 'user_profile_update' user_ %}"><span class="glyphicon glyphicon-pencil"></span> {% trans "update your profile"|title %}</a> | ||
24 | + {% endifequal %} | ||
25 | + | ||
26 | + <div class="divider"></div> | ||
27 | + | ||
28 | + <ul class="unstyled-list"> | ||
29 | + {% if user_.institution or user_.role %} | ||
30 | + <li> | ||
31 | + <span class="icon-briefcase icon-fixed-width"></span> | ||
32 | + {{ user_.role }} | ||
33 | + {% if user_.institution and user_.role %}-{% endif %} | ||
34 | + {{ user_.institution }} | ||
35 | + </li> | ||
36 | + {% endif %} | ||
37 | + {% if user_.twitter %} | ||
38 | + <li><span class="icon-twitter icon-fixed-width"></span> {{ user_.twitter }}</li> | ||
39 | + {% endif %} | ||
40 | + {% if user_.facebook %} | ||
41 | + <li><span class="icon-facebook icon-fixed-width"></span> {{ user_.facebook }}</li> | ||
42 | + {% endif %} | ||
43 | + {% if user_.google_talk %} | ||
44 | + <li><span class="icon-google-plus icon-fixed-width"></span> {{ user_.google_talk }}</li> | ||
45 | + {% endif %} | ||
46 | + {% if user_.webpage %} | ||
47 | + <li><span class="icon-link icon-fixed-width"></span> {{ user_.webpage }}</li> | ||
48 | + {% endif %} | ||
49 | + </ul> | ||
50 | + </div> | ||
51 | + | ||
52 | + <div class="col-lg-5 col-md-5 col-sm-8"> | ||
53 | + <div class="panel panel-default"> | ||
54 | + <div class="panel-heading"> | ||
55 | + <h3 class="panel-title">{% trans "Contributions by Area" %}</h3> | ||
56 | + </div> | ||
57 | + <div class="panel-body"> | ||
58 | + <div id="collabs"></div> | ||
59 | + </div> | ||
60 | + </div> | ||
61 | + </div> | ||
62 | + | ||
63 | + | ||
64 | + <div class="col-lg-4 col-md-4 col-sm-8"> | ||
65 | + <div class="panel panel-default"> | ||
66 | + <div class="panel-heading"> | ||
67 | + <h3 class="panel-title">{% trans "Mailing list Participation" %}</h3> | ||
68 | + </div> | ||
69 | + <div class="panel-body"> | ||
70 | + <div id="collabs2"></div> | ||
71 | + </div> | ||
72 | + </div> | ||
73 | + </div> | ||
74 | + | ||
75 | + </div> | ||
76 | + <div class="row"> | ||
77 | + <div class="col-lg-6 col-md-6 col-sm-12"> | ||
78 | + <h3>{% trans "Latest posted" %} </h3> | ||
79 | + <ul class="message-list"> | ||
80 | + {% for doc in emails %} | ||
81 | + {% include "message-preview.html" %} | ||
82 | + {% empty %} | ||
83 | + <li>{% trans "There are no posts by this user so far." %}</li> | ||
84 | + {% endfor %} | ||
85 | + </ul> | ||
86 | + </div> | ||
87 | + | ||
88 | + <div class="col-lg-6 col-md-6 col-sm-12"> | ||
89 | + <h3>{% trans "Community inside participations" %}</h3> | ||
90 | + <ul class="message-list"> | ||
91 | + {% for doc in docs %} | ||
92 | + {% include "message-preview.html" %} | ||
93 | + {% empty %} | ||
94 | + <li>{% trans "No contributions of this user so far." %}</li> | ||
95 | + {% endfor %} | ||
96 | + </ul> | ||
97 | + </div> | ||
98 | + | ||
99 | + </div> | ||
100 | + | ||
101 | +{% endblock %} |
src/accounts/urls.py
1 | 1 | ||
2 | from django.conf.urls import patterns, include, url | 2 | from django.conf.urls import patterns, include, url |
3 | 3 | ||
4 | -from .views import UserProfileDetailView | 4 | +from .views import UserProfileDetailView, UserProfileUpdateView |
5 | 5 | ||
6 | 6 | ||
7 | urlpatterns = patterns('', | 7 | urlpatterns = patterns('', |
@@ -12,6 +12,6 @@ urlpatterns = patterns('', | @@ -12,6 +12,6 @@ urlpatterns = patterns('', | ||
12 | url(r'^(?P<username>[\w@+.-]+)/?$', | 12 | url(r'^(?P<username>[\w@+.-]+)/?$', |
13 | UserProfileDetailView.as_view(), name='user_profile'), | 13 | UserProfileDetailView.as_view(), name='user_profile'), |
14 | 14 | ||
15 | - #url(r'^user/(?P<username>[\w@+.-]+)/edit/?$', | ||
16 | - # 'colab.deprecated.views.userprofile.update', name='user_profile_update'), | 15 | + url(r'^(?P<username>[\w@+.-]+)/edit/?$', |
16 | + UserProfileUpdateView.as_view(), name='user_profile_update'), | ||
17 | ) | 17 | ) |
src/accounts/views.py
@@ -4,7 +4,7 @@ | @@ -4,7 +4,7 @@ | ||
4 | from django.contrib import messages | 4 | from django.contrib import messages |
5 | 5 | ||
6 | from django.contrib.auth import get_user_model | 6 | from django.contrib.auth import get_user_model |
7 | -from django.views.generic import DetailView | 7 | +from django.views.generic import DetailView, UpdateView |
8 | from django.utils.translation import ugettext as _ | 8 | from django.utils.translation import ugettext as _ |
9 | from django.shortcuts import render, redirect | 9 | from django.shortcuts import render, redirect |
10 | 10 | ||
@@ -15,12 +15,36 @@ from super_archives.models import EmailAddress, Message | @@ -15,12 +15,36 @@ from super_archives.models import EmailAddress, Message | ||
15 | from .forms import NewUserForm, ListsForm | 15 | from .forms import NewUserForm, ListsForm |
16 | 16 | ||
17 | 17 | ||
18 | -class UserProfileDetailView(DetailView): | 18 | +class UserProfileBaseMixin(object): |
19 | model = get_user_model() | 19 | model = get_user_model() |
20 | slug_field = 'username' | 20 | slug_field = 'username' |
21 | slug_url_kwarg = 'username' | 21 | slug_url_kwarg = 'username' |
22 | context_object_name = 'user_' | 22 | context_object_name = 'user_' |
23 | - template_name = 'accounts/user-profile.html' | 23 | + |
24 | + | ||
25 | +class UserProfileUpdateView(UserProfileBaseMixin, UpdateView): | ||
26 | + template_name = 'accounts/user_form.html' | ||
27 | + #form_class = UserUpdateForm | ||
28 | + | ||
29 | + def get_success_url(self): | ||
30 | + return reverse('user_profile', kwargs={'username': self.object.username}) | ||
31 | + | ||
32 | + def get_initial(self): | ||
33 | + return { | ||
34 | + 'first_name': self.object.first_name, | ||
35 | + 'last_name': self.object.last_name, | ||
36 | + 'email': self.object.email, | ||
37 | + 'institution': self.object.profile.institution, | ||
38 | + 'role': self.object.profile.role, | ||
39 | + 'twitter': self.object.profile.twitter, | ||
40 | + 'facebook': self.object.profile.facebook, | ||
41 | + 'google_talk': self.object.profile.google_talk, | ||
42 | + 'webpage': self.object.profile.webpage, | ||
43 | + } | ||
44 | + | ||
45 | + | ||
46 | +class UserProfileDetailView(UserProfileBaseMixin, DetailView): | ||
47 | + template_name = 'accounts/user_detail.html' | ||
24 | 48 | ||
25 | def get_context_data(self, **kwargs): | 49 | def get_context_data(self, **kwargs): |
26 | user = self.object | 50 | user = self.object |
@@ -50,14 +74,14 @@ def signup(request): | @@ -50,14 +74,14 @@ def signup(request): | ||
50 | if request.method == 'GET': | 74 | if request.method == 'GET': |
51 | user_form = NewUserForm() | 75 | user_form = NewUserForm() |
52 | lists_form = ListsForm() | 76 | lists_form = ListsForm() |
53 | - return render(request, 'registration/registration_form.html', | 77 | + return render(request, 'accounts/user_create_form.html', |
54 | {'user_form': user_form, 'lists_form': lists_form}) | 78 | {'user_form': user_form, 'lists_form': lists_form}) |
55 | 79 | ||
56 | user_form = NewUserForm(request.POST) | 80 | user_form = NewUserForm(request.POST) |
57 | lists_form = ListsForm(request.POST) | 81 | lists_form = ListsForm(request.POST) |
58 | 82 | ||
59 | if not user_form.is_valid() or not lists_form.is_valid(): | 83 | if not user_form.is_valid() or not lists_form.is_valid(): |
60 | - return render(request, 'registration/registration_form.html', | 84 | + return render(request, 'accounts/user_create_form.html', |
61 | {'user_form': user_form, 'lists_form': lists_form}) | 85 | {'user_form': user_form, 'lists_form': lists_form}) |
62 | 86 | ||
63 | user = user_form.save() | 87 | user = user_form.save() |
@@ -80,4 +104,3 @@ def signup(request): | @@ -80,4 +104,3 @@ def signup(request): | ||
80 | 'Profiles not validated are deleted in 24h.')) | 104 | 'Profiles not validated are deleted in 24h.')) |
81 | 105 | ||
82 | return redirect('user_profile', username=user.username) | 106 | return redirect('user_profile', username=user.username) |
83 | - |
src/super_archives/templatetags/form_field.py
@@ -1,64 +0,0 @@ | @@ -1,64 +0,0 @@ | ||
1 | -from django import template | ||
2 | -from django import forms | ||
3 | - | ||
4 | -def render_form_field(parser, token): | ||
5 | - variables = token.split_contents() | ||
6 | - | ||
7 | - if len(variables) == 2: | ||
8 | - tag_name, form_field = variables | ||
9 | - default_value = 'None' | ||
10 | - elif len(variables) == 3: | ||
11 | - tag_name, form_field, default_value = variables | ||
12 | - else: | ||
13 | - raise template.TemplateSyntaxError | ||
14 | - | ||
15 | - return RenderFormField(form_field, default_value) | ||
16 | - | ||
17 | - | ||
18 | -class RenderFormField(template.Node): | ||
19 | - | ||
20 | - def __init__(self, form_field, default_value): | ||
21 | - self.form_field_nocontext = template.Variable(form_field) | ||
22 | - self.default_value_nocontext = template.Variable(default_value) | ||
23 | - | ||
24 | - def render(self, context): | ||
25 | - editable = context.get('editable', True) | ||
26 | - | ||
27 | - class_ = u'' | ||
28 | - errors = u'' | ||
29 | - form_field_tag = u'' | ||
30 | - try: | ||
31 | - form_field = self.form_field_nocontext.resolve(context) | ||
32 | - except template.VariableDoesNotExist: | ||
33 | - return u'' | ||
34 | - | ||
35 | - if form_field.errors: | ||
36 | - class_ += u'error' | ||
37 | - if form_field.field.required: | ||
38 | - class_ += u' required' | ||
39 | - if form_field.errors: | ||
40 | - errors = u'<br/>' + form_field.errors.as_text() | ||
41 | - | ||
42 | - try: | ||
43 | - default_value = self.default_value_nocontext.resolve(context) | ||
44 | - except template.VariableDoesNotExist: | ||
45 | - default_value = u'' | ||
46 | - | ||
47 | - if editable: | ||
48 | - form_field_tag = u'<br/>' + unicode(form_field) | ||
49 | - elif isinstance(form_field.field, forms.URLField): | ||
50 | - form_field_tag = u"""<a href="%s" target="_blank">%s</a>""" % ( | ||
51 | - default_value, default_value) | ||
52 | - else: | ||
53 | - form_field_tag = default_value | ||
54 | - | ||
55 | - return u"""<p class="%s">%s %s %s</p>""" % ( | ||
56 | - class_, | ||
57 | - form_field.label_tag(), | ||
58 | - form_field_tag, | ||
59 | - errors | ||
60 | - ) | ||
61 | - | ||
62 | - | ||
63 | -register = template.Library() | ||
64 | -register.tag('render_form_field', render_form_field) |
src/super_archives/validators.py
@@ -1,15 +0,0 @@ | @@ -1,15 +0,0 @@ | ||
1 | -# -*- coding: utf-8 -*- | ||
2 | - | ||
3 | -from django.core.exceptions import ValidationError | ||
4 | - | ||
5 | -class UniqueValidator(object): | ||
6 | - | ||
7 | - def __init__(self, model, field_name): | ||
8 | - self.model = model | ||
9 | - self.field_name = field_name | ||
10 | - | ||
11 | - def __call__(self, value): | ||
12 | - result = self.model.objects.filter(**{self.field_name: value}) | ||
13 | - if result: | ||
14 | - msg = u'Já existente. Escolha outro.' | ||
15 | - raise ValidationError(msg) |