Commit d44d52e59ca8d146f68961c38e09532d4c46ba69

Authored by Sergio Oliveira
1 parent 3e13bc79

Merging

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>&nbsp;&nbsp;{% 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/templates/accounts/user_create_form.html 0 → 100644
@@ -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 %}
src/accounts/templates/accounts/user_detail.html 0 → 100644
@@ -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>&nbsp;&nbsp;{% 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(&#39;&#39;, @@ -12,6 +12,6 @@ urlpatterns = patterns(&#39;&#39;,
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)