Skip to content

Commit b2573a4

Browse files
committed
Merged community tracking branch from esanchez@yaco.es, r3175-3679,3713-3830.
[[Split portion of a mixed commit.]] - Legacy-Id: 4518.2
2 parents 1603cda + 3ad9d48 commit b2573a4

24 files changed

Lines changed: 935 additions & 38 deletions

ietf/ietfauth/forms.py

Lines changed: 54 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111

1212
from ietf.utils.mail import send_mail
1313
from ietf.utils import debug
14-
#from ietf.person.models import Person, Email
14+
from ietf.person.models import Person, Email
1515

1616

1717
class RegistrationForm(forms.Form):
@@ -96,34 +96,64 @@ def get_password(self):
9696
return self.cleaned_data.get('password1')
9797

9898
def create_user(self):
99-
# user = User.objects.create(username=self.username,
100-
# email=self.username)
101-
# person = Person.objects.create(user=user,
102-
# name=self.username,
103-
# ascii=self.username)
104-
# Email.objects.create(person=person,
105-
# address=self.username)
106-
# return user
107-
return None
99+
user = User.objects.create(username=self.username,
100+
email=self.username)
101+
email = Email.objects.filter(address=self.username)
102+
person = None
103+
if email.count():
104+
email = email[0]
105+
if email.person:
106+
person = email.person
107+
else:
108+
email = None
109+
if not person:
110+
person = Person.objects.create(user=user,
111+
name=self.username,
112+
ascii=self.username)
113+
if not email:
114+
email = Email.objects.create(address=self.username,
115+
person=person)
116+
email.person = person
117+
email.save()
118+
person.user = user
119+
person.save()
120+
return user
108121

109122
def get_user(self):
110123
return User.objects.get(username=self.username)
111124

112-
@debug.trace
125+
def save_password_file(self):
126+
if getattr(settings, 'USE_PYTHON_HTDIGEST', None):
127+
pass_file = settings.HTPASSWD_FILE
128+
realm = settings.HTDIGEST_REALM
129+
password = self.get_password()
130+
username = self.username
131+
prefix = '%s:%s:' % (username, realm)
132+
key = hashlib.md5(prefix + password).hexdigest()
133+
f = open(pass_file, 'r+')
134+
pos = f.tell()
135+
line = f.readline()
136+
while line:
137+
if line.startswith(prefix):
138+
break
139+
pos=f.tell()
140+
line = f.readline()
141+
f.seek(pos)
142+
f.write('%s%s\n' % (prefix, key))
143+
f.close()
144+
else:
145+
p = subprocess.Popen([settings.HTPASSWD_COMMAND, "-b", settings.HTPASSWD_FILE, self.username, self.get_password()], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
146+
stdout, stderr = p.communicate()
147+
113148
def save(self):
114-
# if self.update_user:
115-
# user = self.get_user()
116-
# else:
117-
# user = self.create_user()
118-
# user.set_password(self.get_password())
119-
# user.save()
120-
# return user
121-
debug.show("[settings.HTPASSWD_COMMAND, settings.HTPASSWD_FILE, self.username, self.get_password()]")
122-
p = subprocess.Popen([settings.HTPASSWD_COMMAND, "-b", settings.HTPASSWD_FILE, self.username, self.get_password()], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
123-
stdout, stderr = p.communicate()
124-
debug.show('stdout')
125-
debug.show('stderr')
126-
return p.returncode
149+
if self.update_user:
150+
user = self.get_user()
151+
else:
152+
user = self.create_user()
153+
user.set_password(self.get_password())
154+
user.save()
155+
self.save_password_file()
156+
return user
127157

128158
class TestEmailForm(forms.Form):
129159
email = forms.EmailField(required=False)

ietf/ietfauth/views.py

Lines changed: 18 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -35,20 +35,25 @@
3535
import datetime
3636
import hashlib
3737

38+
from django.conf import settings
3839
from django.template import RequestContext
3940
from django.http import HttpResponse, Http404, HttpResponseRedirect
4041
from django.shortcuts import get_object_or_404, render_to_response
41-
from django.contrib.auth.decorators import login_required
4242
from django.contrib.auth import REDIRECT_FIELD_NAME, authenticate, login
43+
from django.contrib.auth.decorators import login_required
4344
from django.contrib.auth.models import User
44-
from django.conf import settings
45+
from django.http import HttpResponseRedirect, HttpResponse, Http404
46+
from django.shortcuts import render_to_response
47+
from django.template import RequestContext
48+
from django.utils import simplejson
4549
from django.utils.http import urlquote
46-
4750
from django.contrib.auth.models import User
4851
from django.utils import simplejson as json
4952
from django.utils.translation import ugettext as _
5053

51-
from forms import *
54+
#from forms import *
55+
from ietf.ietfauth.forms import (RegistrationForm, PasswordForm,
56+
RecoverPasswordForm)
5257

5358

5459
def index(request):
@@ -61,7 +66,8 @@ def url_login(request, user, passwd):
6166
if user.is_active:
6267
login(request, user)
6368
return HttpResponseRedirect('/accounts/loggedin/?%s=%s' % (REDIRECT_FIELD_NAME, urlquote(redirect_to)))
64-
return HttpResponse("Not authenticated?", status=500)
69+
return HttpResponse("Not authenticated?", status=500)
70+
6571

6672
def ietf_login(request):
6773
if not request.user.is_authenticated():
@@ -71,6 +77,7 @@ def ietf_login(request):
7177
request.session.set_test_cookie()
7278
return HttpResponseRedirect('/accounts/loggedin/?%s=%s' % (REDIRECT_FIELD_NAME, urlquote(redirect_to)))
7379

80+
7481
def ietf_loggedin(request):
7582
if not request.session.test_cookie_worked():
7683
return HttpResponse("You need to enable cookies")
@@ -79,28 +86,28 @@ def ietf_loggedin(request):
7986
if not redirect_to or '//' in redirect_to or ' ' in redirect_to:
8087
redirect_to = settings.LOGIN_REDIRECT_URL
8188
return HttpResponseRedirect(redirect_to)
82-
89+
90+
8391
@login_required
8492
def profile(request):
8593
if settings.USE_DB_REDESIGN_PROXY_CLASSES:
8694
from ietf.person.models import Person
8795
from ietf.group.models import Role
88-
96+
8997
roles = []
9098
person = None
9199
try:
92100
person = request.user.get_profile()
93101
roles = Role.objects.filter(person=person)
94102
except Person.DoesNotExist:
95103
pass
96-
104+
97105
return render_to_response('registration/profileREDESIGN.html',
98106
dict(roles=roles,
99107
person=person),
100108
context_instance=RequestContext(request))
101-
102-
return render_to_response('registration/profile.html', context_instance=RequestContext(request))
103109

110+
return render_to_response('registration/profile.html', context_instance=RequestContext(request))
104111

105112
def create_account(request):
106113
success = False
@@ -178,7 +185,7 @@ def ajax_check_username(request):
178185
username = request.GET.get('username', '')
179186
error = False
180187
if User.objects.filter(username=username).count():
181-
error = _('This email is already in use')
188+
error = _('This email address is already registered')
182189
return HttpResponse(json.dumps({'error': error}), mimetype='text/plain')
183190

184191
def test_email(request):

ietf/settings.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,7 @@
158158
'ietf.ietfworkflows',
159159
'ietf.wgchairs',
160160
'ietf.wgcharter',
161+
'ietf.community',
161162
)
162163

163164
INTERNAL_IPS = (

ietf/templates/base_leftmenu.html

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,8 @@
3333

3434
{% endcomment %}
3535
{% load wg_menu %}
36-
{% load ietf_filters ietf_streams %}
36+
{% load ietf_filters ietf_streams community_tags %}
37+
{% load ietf_filters community_tags %}
3738
<ul>
3839
<li class="sect first">Accounts</li>
3940
<li><a href="{% url account_index %}">New Account</a></li>
@@ -76,6 +77,15 @@
7677
<li><a href="http://tools.ietf.org/wg/concluded">Concluded WGs</a></li>
7778
<li><a href="http://www.ietf.org/list/nonwg.html">Non-WG Lists</a></li>
7879

80+
{% get_user_managed_lists user as community_lists %}
81+
{% if community_lists %}
82+
<li class="sect">Community ID lists</li>
83+
<li><a href="{{ community_lists.personal.get_manage_url }}">{{ community_lists.personal.short_name }}</a>
84+
{% for cl in community_lists.group %}
85+
<li><a href="{{ cl.get_manage_url }}">{{ cl.short_name }}</a>
86+
{% endfor %}
87+
{% endif %}
88+
7989
<li class="sect">Drafts&nbsp;&amp;&nbsp;RFCs</li>
8090
<li><a href="/doc/">Search</a></li>
8191
<li><form action="/doc/search/" method="get" style="padding-bottom:0;margin-bottom:0;"><input type="text" style="margin-left:10px; width:100px; border:1px solid #89d;" name="name" /><input type="hidden" name="activeDrafts" value="on"/><input type="hidden" name="rfcs" value="on"/></form></li>
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
<h2>Display customization</h2>
2+
3+
<form action="#custom" method="POST" />
4+
<h3>Sort method</h2>
5+
{{ display_form.sort_method }}
6+
7+
<h3>Show fields</h2>
8+
<div>
9+
{% for field in dc.get_display_fields_config %}
10+
<div style="float: left; width: 30%;">
11+
<input id="id_{{ field.codename }}" type="checkbox" name="{{ field.codename }}"{% if field.active %} checked="checked"{% endif %} />
12+
<label for="id_{{ field.codename }}">{{ field.description }}</label>
13+
</div>
14+
{% endfor %}
15+
</div>
16+
<div style="clear: both;"><br /></div>
17+
<input type="submit" value="Save configuration" name="save_display" />
18+
</form>
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
<span class="displayField displayField-{{ field.codename }}">{{ value|safe }}</span>
Lines changed: 125 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,125 @@
1+
{% extends "base.html" %}
2+
3+
{% block pagehead %}
4+
{{ block.super }}
5+
<script type="text/javascript" src="/js/lib/jquery-1.4.2.min.js"></script>
6+
<script type="text/javascript" src="/js/yui/yui-20100305.js"></script>
7+
<script type="text/javascript" src="/js/base.js"></script>
8+
<script type="text/javascript" src="/js/community.js"></script>
9+
{% endblock pagehead %}
10+
11+
{% block title %}{{ cl.long_name }}{% endblock %}
12+
13+
{% block content %}
14+
<h1>{{ cl.long_name }}</h1>
15+
<div id="mytabs" class="yui-navset">
16+
<ul class="yui-nav">
17+
<li class="selected"><a href="#view"><em>Documents</em></a></li>
18+
<li><a href="#documents"><em>Manually added</em></a></li>
19+
<li><a href="#rules"><em>Rules</em></a></li>
20+
<li><a href="#custom"><em>Display customization</em></a></li>
21+
<li><a href="#info"><em>Exports</em></a></li>
22+
</ul>
23+
24+
<div class="yui-content">
25+
26+
<div id="view">
27+
{% include "community/view_list.html" %}
28+
</div>
29+
30+
<div id="documents">
31+
<h2>Documents manually added to this list</h2>
32+
<p>
33+
In order to add some individual documents to your list you have to:
34+
</p>
35+
<ul>
36+
<li>Search the document or documents you want to add using <a href="/doc/search">the datatracker searcher</a>.</li>
37+
<li>In the search result you'll find a link to add individual documents to your list.</li>
38+
</ul>
39+
<table class="ietf-table">
40+
<tr><th>Name</th><th>Title</th><th>Remove from list</th></tr>
41+
{% for doc in cl.added_ids.all %}
42+
<tr class="{% cycle oddrow,evenrow %}">
43+
<td>{{ doc }}</td>
44+
<td><a href="{{ doc.get_absolute_url }}"</a>{{ doc.title }}</td>
45+
<td><a href="{% url community_remove_document cl.pk doc.pk %}">Remove</a></td>
46+
</tr>
47+
{% endfor %}
48+
</table>
49+
</div>
50+
51+
<div id="rules">
52+
<h2>Rules added to this list</h2>
53+
<table class="ietf-table">
54+
<tr><th>Rule</th><th>Value</th><th>Documents</th><th>Remove from list</th></tr>
55+
{% for rule in cl.rule_set.all %}
56+
{% with rule.get_callable_rule as callable %}
57+
<tr class="{% cycle oddrow,evenrow %}">
58+
<td>{{ callable.description }}</td>
59+
<td>{{ callable.show_value }}</td>
60+
<td>{% with rule.cached_ids.count as count %}{{ count }} document{{ count|pluralize }}{% endwith %}</td>
61+
<td><a href="{% url community_remove_rule cl.pk rule.pk %}">Remove</a></td>
62+
</tr>
63+
{% endwith %}
64+
{% endfor %}
65+
</table>
66+
67+
<h3>Add a new rule</h3>
68+
<form method="post" action="#rules">
69+
{{ rule_form.as_p }}
70+
<input type="submit" name="save_rule" value="Add rule" />
71+
</form>
72+
<div class="rule_values" style="display: none;">
73+
{% for entry in rule_form.get_all_options %}
74+
<div class="{{ entry.type }}">
75+
<select>
76+
{% for option in entry.options %}
77+
<option value={{ option.0 }}>{{ option.1 }}</option>
78+
{% endfor %}
79+
</select>
80+
</div>
81+
{% endfor %}
82+
</div>
83+
</div>
84+
85+
<div id="custom">
86+
{% include "community/customize_display.html" %}
87+
</div>
88+
89+
<div id="info">
90+
<p>Feel free to share the following links if you need it.</p>
91+
<ul>
92+
<li><a href="{{ cl.secret }}/view/">Read only view for {{ cl.long_name }}</a></li>
93+
<li><a href="{{ cl.secret }}/changes/feed/">Feed for every change in status of {{ cl.long_name }}</a></li>
94+
<li><a href="{{ cl.secret }}/changes/significant/feed/">Feed for significant change in status of {{ cl.long_name }}</a></li>
95+
<li><a href="{{ cl.secret }}/subscribe/">Subscribe to the mailing list for every change in status of {{ cl.long_name }}</a></li>
96+
<li><a href="{{ cl.secret }}/subscribe/significant/">Subscribe to the mailing list for significant change in status of {{ cl.long_name }}</a></li>
97+
</ul>
98+
99+
<p>Export your list to CSV format</p>
100+
<ul>
101+
<li><a href="csv/">CSV for {{ cl.long_name }}</a></li>
102+
</ul>
103+
</div>
104+
105+
</div>
106+
</div>
107+
108+
<script type="text/javascript">
109+
//<![CDATA[
110+
var tabView = new YAHOO.widget.TabView('mytabs');
111+
var url = location.href.split('#');
112+
if (url[1]) {
113+
url[1] = "#"+url[1];
114+
var tabs = tabView.get('tabs');
115+
for (var i = 0; i < tabs.length; i++) {
116+
if (url[1].indexOf(tabs[i].get('href')) == 0) {
117+
tabView.set('activeIndex', i);
118+
break;
119+
}
120+
}
121+
}
122+
//]]>
123+
</script>
124+
125+
{% endblock %}

0 commit comments

Comments
 (0)