Commit d44d52e59ca8d146f68961c38e09532d4c46ba69

Authored by Sergio Oliveira
1 parent 3e13bc79

Merging

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>&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 @@
  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 @@
  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 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(&#39;&#39;,
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)