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 | 2 | |
3 | 3 | from django import forms |
4 | 4 | from django.contrib.auth import get_user_model |
5 | -from django.contrib.auth.forms import UserCreationForm as UserCreationForm_ | |
6 | 5 | from django.utils.translation import ugettext_lazy as _ |
7 | 6 | |
8 | 7 | from super_archives.models import MailingList | ... | ... |
src/accounts/templates/accounts/signup-form.html
... | ... | @@ -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 | -{% 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 @@ |
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 @@ |
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 | 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 | 7 | urlpatterns = patterns('', |
... | ... | @@ -12,6 +12,6 @@ urlpatterns = patterns('', |
12 | 12 | url(r'^(?P<username>[\w@+.-]+)/?$', |
13 | 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 | 4 | from django.contrib import messages |
5 | 5 | |
6 | 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 | 8 | from django.utils.translation import ugettext as _ |
9 | 9 | from django.shortcuts import render, redirect |
10 | 10 | |
... | ... | @@ -15,12 +15,36 @@ from super_archives.models import EmailAddress, Message |
15 | 15 | from .forms import NewUserForm, ListsForm |
16 | 16 | |
17 | 17 | |
18 | -class UserProfileDetailView(DetailView): | |
18 | +class UserProfileBaseMixin(object): | |
19 | 19 | model = get_user_model() |
20 | 20 | slug_field = 'username' |
21 | 21 | slug_url_kwarg = 'username' |
22 | 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 | 49 | def get_context_data(self, **kwargs): |
26 | 50 | user = self.object |
... | ... | @@ -50,14 +74,14 @@ def signup(request): |
50 | 74 | if request.method == 'GET': |
51 | 75 | user_form = NewUserForm() |
52 | 76 | lists_form = ListsForm() |
53 | - return render(request, 'registration/registration_form.html', | |
77 | + return render(request, 'accounts/user_create_form.html', | |
54 | 78 | {'user_form': user_form, 'lists_form': lists_form}) |
55 | 79 | |
56 | 80 | user_form = NewUserForm(request.POST) |
57 | 81 | lists_form = ListsForm(request.POST) |
58 | 82 | |
59 | 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 | 85 | {'user_form': user_form, 'lists_form': lists_form}) |
62 | 86 | |
63 | 87 | user = user_form.save() |
... | ... | @@ -80,4 +104,3 @@ def signup(request): |
80 | 104 | 'Profiles not validated are deleted in 24h.')) |
81 | 105 | |
82 | 106 | return redirect('user_profile', username=user.username) |
83 | - | ... | ... |
src/super_archives/templatetags/form_field.py
... | ... | @@ -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 | -# -*- 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) |