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