Revision 390c4b88
b/pithos/im/target/invitation.py | ||
---|---|---|
35 | 35 |
|
36 | 36 |
from datetime import datetime |
37 | 37 |
|
38 |
from django.conf import settings |
|
38 | 39 |
from django.http import HttpResponseBadRequest |
39 | 40 |
|
40 | 41 |
from pithos.im.models import User, Invitation |
41 | 42 |
from pithos.im.target.util import prepare_response |
42 | 43 |
|
43 | 44 |
|
44 |
INVITATIONS_PER_LEVEL = { |
|
45 |
0 : 10000, |
|
46 |
1 : 3, |
|
47 |
2 : 2, |
|
48 |
3 : 1, |
|
49 |
4 : 0} |
|
50 |
|
|
51 |
|
|
52 | 45 |
def login(request): |
53 | 46 |
code = request.GET.get('code') |
54 | 47 |
try: |
55 | 48 |
invitation = Invitation.objects.get(code=code) |
56 | 49 |
except Invitation.DoesNotExist: |
57 |
return HttpResponseBadRequest('Does Not Exist')
|
|
50 |
return HttpResponseBadRequest('Wrong invitation code')
|
|
58 | 51 |
|
59 | 52 |
if not invitation.is_accepted: |
60 | 53 |
invitation.is_accepted = True |
... | ... | |
62 | 55 |
invitation.save() |
63 | 56 |
logging.info('Accepted invitation %s', invitation) |
64 | 57 |
|
65 |
user, created = User.objects.get_or_create(uniq=invitation.uniq) |
|
58 |
user, created = User.objects.get_or_create(uniq=invitation.uniq, |
|
59 |
defaults={ |
|
60 |
'realname': invitation.realname, |
|
61 |
'affiliation': 'Invitation', |
|
62 |
'level': invitation.inviter.level + 1 |
|
63 |
}) |
|
66 | 64 |
if created: |
67 |
user.realname = invitation.realname |
|
68 |
user.affiliation = 'Invitation' |
|
69 |
user.level = invitation.inviter.level + 1 |
|
70 |
user.invitations = INVITATIONS_PER_LEVEL.get(user.level, 0) |
|
71 | 65 |
user.renew_token() |
72 | 66 |
user.save() |
73 | 67 |
logging.info('Created user %s', user) |
b/pithos/im/views.py | ||
---|---|---|
188 | 188 |
|
189 | 189 |
|
190 | 190 |
def generate_invitation_code(): |
191 |
return randint(1, 2L**63 - 1) |
|
191 |
while True: |
|
192 |
code = randint(1, 2L**63 - 1) |
|
193 |
try: |
|
194 |
Invitation.objects.get(code=code) |
|
195 |
# An invitation with this code already exists, try again |
|
196 |
except Invitation.DoesNotExist: |
|
197 |
return code |
|
192 | 198 |
|
193 | 199 |
|
194 | 200 |
def send_invitation(inv): |
... | ... | |
199 | 205 |
'url': url}) |
200 | 206 |
sender = settings.DEFAULT_FROM_EMAIL |
201 | 207 |
send_mail(subject, message, sender, [inv.uniq]) |
202 |
inv.inviter.invitations = max(0, inv.inviter.invitations - 1) |
|
203 |
inv.inviter.save() |
|
204 | 208 |
logging.info('Sent invitation %s', inv) |
205 | 209 |
|
206 | 210 |
|
... | ... | |
208 | 212 |
def invite(request): |
209 | 213 |
status = None |
210 | 214 |
message = None |
215 |
inviter = request.user |
|
211 | 216 |
|
212 | 217 |
if request.method == 'POST': |
213 |
if request.user.invitations > 0: |
|
218 |
uniq = request.POST.get('uniq') |
|
219 |
realname = request.POST.get('realname') |
|
220 |
|
|
221 |
if inviter.invitations > 0: |
|
214 | 222 |
code = generate_invitation_code() |
215 |
invitation, created = Invitation.objects.get_or_create(code=code) |
|
216 |
invitation.inviter=request.user |
|
217 |
invitation.realname=request.POST.get('realname') |
|
218 |
invitation.uniq=request.POST.get('uniq') |
|
219 |
invitation.save() |
|
223 |
invitation, created = Invitation.objects.get_or_create( |
|
224 |
inviter=inviter, |
|
225 |
uniq=uniq, |
|
226 |
defaults={'code': code, 'realname': realname}) |
|
220 | 227 |
|
221 | 228 |
try: |
222 | 229 |
send_invitation(invitation) |
230 |
if created: |
|
231 |
inviter.invitations = max(0, inviter.invitations - 1) |
|
232 |
inviter.save() |
|
223 | 233 |
status = 'success' |
224 |
message = _('Invitation sent to %s' % invitation.uniq)
|
|
234 |
message = _('Invitation sent to %s' % uniq) |
|
225 | 235 |
except (SMTPException, socket.error) as e: |
226 | 236 |
status = 'error' |
227 | 237 |
message = e.strerror |
... | ... | |
230 | 240 |
message = _('No invitations left') |
231 | 241 |
|
232 | 242 |
if request.GET.get('format') == 'json': |
233 |
rep = {'invitations': request.user.invitations} |
|
243 |
sent = [{'email': inv.uniq, |
|
244 |
'realname': inv.realname, |
|
245 |
'is_accepted': inv.is_accepted} |
|
246 |
for inv in inviter.invitations_sent.all()] |
|
247 |
rep = {'invitations': inviter.invitations, 'sent': sent} |
|
234 | 248 |
return HttpResponse(json.dumps(rep)) |
235 | 249 |
|
236 | 250 |
html = render_to_string('invitations.html', { |
237 |
'user': request.user,
|
|
251 |
'user': inviter,
|
|
238 | 252 |
'status': status, |
239 | 253 |
'message': message}) |
240 | 254 |
return HttpResponse(html) |
b/pithos/settings.py.dist | ||
---|---|---|
168 | 168 |
# Address to use for outgoing emails |
169 | 169 |
DEFAULT_FROM_EMAIL = 'Pithos <no-reply@grnet.gr>' |
170 | 170 |
|
171 |
INVITATIONS_PER_LEVEL = { |
|
172 |
0 : 1000, |
|
173 |
1 : 0, |
|
174 |
2 : 0, |
|
175 |
3 : 0, |
|
176 |
4 : 0 |
|
177 |
} |
|
178 |
|
|
171 | 179 |
# Where users should login with their invitation code |
172 | 180 |
INVITATION_LOGIN_TARGET = 'https://pithos.dev.grnet.gr/im/login/invitation' \ |
173 | 181 |
'?code=%d' \ |
Also available in: Unified diff