def on_order_created(sender, **kwargs): if sender.total() == 0: on_purchase_completed(sender) elif sender.method == 'bank': utils.email('bank-order-complete', ctx={ 'order': sender, }, to=[sender.user.user.email]).send() ritems = kwargs['raw_items'] for fare, params in ritems: # se l'ordine contiene delle prenotazione alberghiere devo creare i # relativi ticket adesso, perchè le informazioni sul periodo le ho solo # tramite ritems if fare.code[0] == 'H': log.info( 'The newly created order "%s" includes %d hotel reservations "%s" for the period: "%s" -> "%s".', sender.code, params['qty'], fare.code, params['period'][0], params['period'][1]) loop = params['qty'] if fare.code[1] == 'R': loop *= int(fare.code[2]) for _ in range(loop): t = Ticket.objects.filter(fare=fare, user=sender.user.user, p3_conference_room=None)[0] room = models.TicketRoom(ticket=t) room.ticket_type = fare.code[1] room.room_type = models.HotelRoom.objects.get( conference=fare.conference, room_type='t%s' % fare.code[2]) room.checkin = params['period'][0] room.checkout = params['period'][1] room.save()
def create_user(self, email, first_name='', last_name='', password=None, token=False, active=False, assopy_id=None, send_mail=True): uname = janrain.suggest_username_from_email(email) duser = auth.models.User.objects.create_user(uname, email, password=password) duser.first_name = first_name duser.last_name = last_name duser.is_active = active duser.save() user = User(user=duser) if token: user.token = str(uuid4()) if assopy_id is not None: user.assopy_id = assopy_id user.save() user_created.send(sender=user, profile_complete=(password is not None) or (token is not None)) log.info( 'new local user "%s" created; for "%s %s" (%s)', duser.username, first_name, last_name, email, ) if assopy_id is not None and settings.GENRO_BACKEND: genro.user_remote2local(user) if send_mail: utils.email( 'verify-account', ctx={ 'user': duser, 'token': Token.objects.create(ctype='v', user=duser), }, to=[email] ).send() return user
def create_user(self, email, first_name='', last_name='', password=None, token=False, active=False, assopy_id=None, send_mail=True): uname = janrain.suggest_username_from_email(email) duser = auth.models.User.objects.create_user(uname, email, password=password) duser.first_name = first_name duser.last_name = last_name duser.is_active = active duser.save() user = User(user=duser) if token: user.token = str(uuid4()) if assopy_id is not None: user.assopy_id = assopy_id user.save() user_created.send( sender=user, profile_complete=(password is not None) or (token is not None) ) log.info( 'new local user "%s" created; for "%s %s" (%s)', duser.username, first_name, last_name, email, ) if send_mail: utils.email( 'verify-account', ctx={ 'user': duser, 'token': Token.objects.create(ctype='v', user=duser), }, to=[email] ).send() return user
def p3_account_email(request): if request.method == 'POST': form = p3forms.P3ProfileEmailContactForm(data=request.POST, user=request.user) if form.is_valid(): email = form.cleaned_data['email'] if email != request.user.email: log.info( 'requested an email change from "%s" to "%s" for the user "%s"', request.user.email, email, request.user.username, ) utils.email('verify-account', ctx={ 'user': request.user, 'token': amodels.Token.objects.create(ctype='e', user=request.user, payload=email), }, to=[email]).send() else: form = p3forms.P3ProfileEmailContactForm( initial={'email': request.user.email}) ctx = { 'pform': form, } return render(request, "assopy/profile_email_contact.html", ctx)
def p3_account_email(request): if request.method == 'POST': form = p3forms.P3ProfileEmailContactForm(data=request.POST, user=request.user) if form.is_valid(): email = form.cleaned_data['email'] if email != request.user.email: log.info( 'requested an email change from "%s" to "%s" for the user "%s"', request.user.email, email, request.user.username,) utils.email( 'verify-account', ctx={ 'user': request.user, 'token': amodels.Token.objects.create(ctype='e', user=request.user, payload=email), }, to=[email] ).send() else: form = p3forms.P3ProfileEmailContactForm(initial={'email': request.user.email}) ctx = { 'pform': form, } return render(request, "assopy/profile_email_contact.html", ctx)
def p3_account_email(request): if request.method == "POST": form = p3forms.P3ProfileEmailContactForm(data=request.POST, user=request.user) if form.is_valid(): email = form.cleaned_data["email"] if email != request.user.email: log.info( 'requested an email change from "%s" to "%s" for the user "%s"', request.user.email, email, request.user.username, ) utils.email( "verify-account", ctx={ "user": request.user, "token": amodels.Token.objects.create(ctype="e", user=request.user, payload=email), }, to=[email], ).send() else: form = p3forms.P3ProfileEmailContactForm(initial={"email": request.user.email}) ctx = {"pform": form} return render(request, "assopy/profile_email_contact.html", ctx)
def on_order_created(sender, **kwargs): if sender.total() == 0: on_purchase_completed(sender) elif sender.method == 'bank': utils.email( 'bank-order-complete', ctx={'order': sender,}, to=[sender.user.user.email] ).send() ritems = kwargs['raw_items'] for fare, params in ritems: # if the order contains hotel bookings I've to create the tickets # now, because information about periods is only available using ritems if fare.code[0] == 'H': log.info( 'The newly created order "%s" includes %d hotel reservations "%s" for the period: "%s" -> "%s".', sender.code, params['qty'], fare.code, params['period'][0], params['period'][1]) loop = params['qty'] if fare.code[1] == 'R': loop *= int(fare.code[2]) for _ in range(loop): t = Ticket.objects.filter(fare=fare, user=sender.user.user, p3_conference_room=None)[0] room = models.TicketRoom(ticket=t) room.ticket_type = fare.code[1] room.room_type = models.HotelRoom.objects.get(booking__conference=fare.conference, room_type='t%s' % fare.code[2]) room.checkin = params['period'][0] room.checkout = params['period'][1] room.save()
def on_order_created(sender, **kwargs): if sender.total() == 0: on_purchase_completed(sender) elif sender.method == 'bank': utils.email('bank-order-complete', ctx={ 'order': sender, }, to=[sender.user.user.email]).send() ritems = kwargs['raw_items'] for fare, params in ritems: # if the order contains hotel bookings I've to create the tickets # now, because information about periods is only available using ritems if fare.code[0] == 'H': log.info( 'The newly created order "%s" includes %d hotel reservations "%s" for the period: "%s" -> "%s".', sender.code, params['qty'], fare.code, params['period'][0], params['period'][1]) loop = params['qty'] if fare.code[1] == 'R': loop *= int(fare.code[2]) for _ in range(loop): t = Ticket.objects.filter(fare=fare, user=sender.user.user, p3_conference_room=None)[0] room = models.TicketRoom(ticket=t) room.ticket_type = fare.code[1] room.room_type = models.HotelRoom.objects.get( conference=fare.conference, room_type='t%s' % fare.code[2]) room.checkin = params['period'][0] room.checkout = params['period'][1] room.save()
def on_order_created(sender, **kwargs): if sender.total() == 0: on_purchase_completed(sender) elif sender.method == 'bank': utils.email( 'bank-order-complete', ctx={'order': sender,}, to=[sender.user.user.email] ).send() ritems = kwargs['raw_items'] for fare, params in ritems: # se l'ordine contiene delle prenotazione alberghiere devo creare i # relativi ticket adesso, perchè le informazioni sul periodo le ho solo # tramite ritems if fare.code[0] == 'H': log.info( 'The newly created order "%s" includes %d hotel reservations "%s" for the period: "%s" -> "%s".', sender.code, params['qty'], fare.code, params['period'][0], params['period'][1]) loop = params['qty'] if fare.code[1] == 'R': loop *= int(fare.code[2]) for _ in range(loop): t = Ticket.objects.filter(fare=fare, user=sender.user.user, p3_conference_room=None)[0] room = models.TicketRoom(ticket=t) room.ticket_type = fare.code[1] room.room_type = models.HotelRoom.objects.get(conference=fare.conference, room_type='t%s' % fare.code[2]) room.checkin = params['period'][0] room.checkout = params['period'][1] room.save()
def on_purchase_completed(sender, **kwargs): if sender.method == 'admin': return utils.email( 'purchase-complete', ctx={ 'order': sender, 'student': sender.orderitem_set.filter(ticket__fare__recipient_type='s').count() > 0, }, to=[sender.user.user.email], ).send()
def on_credit_note_emitted(sender, **kw): refund = kw['refund'] tpl = 'refund-credit-note' items = list(refund.items.all().select_related('order__user__user')) ctx = { 'items': items, 'name': items[0].order.user.name(), 'refund': refund, 'tickets': [ x.ticket for x in refund.items.all() ], 'credit_note': sender, } utils.email(tpl, ctx, to=[items[0].order.user.user.email]).send()
def on_purchase_completed(sender, **kwargs): if sender.method == 'admin': return utils.email( 'purchase-complete', ctx={ 'order': sender, 'student': sender.orderitem_set.filter( ticket__fare__recipient_type='s').count() > 0, }, to=[sender.user.user.email], ).send()
def _on_attendees_connected(sender, **kw): scanner = User.objects.get(id=kw['attendee1']) scanned = User.objects.get(id=kw['attendee2']) log.info( 'User link: "%s %s" (%s) -> "%s %s" (%s)', scanner.first_name, scanner.last_name, scanner.id, scanned.first_name, scanned.last_name, scanned.id, ) utils.email( 'user-connected', ctx={ 'scanner': scanner, 'scanned': scanned }, to=[scanned.email] ).send()
def _on_attendees_connected(sender, **kw): scanner = User.objects.get(id=kw['attendee1']) scanned = User.objects.get(id=kw['attendee2']) log.info( 'User link: "%s %s" (%s) -> "%s %s" (%s)', scanner.first_name, scanner.last_name, scanner.id, scanned.first_name, scanned.last_name, scanned.id, ) utils.email('user-connected', ctx={ 'scanner': scanner, 'scanned': scanned }, to=[scanned.email]).send()
def handle(self, *args, **options): try: conference = args[0] except IndexError: raise CommandError('conference missing') try: afilter = args[1] except IndexError: afilter = '' qs = models.TalkSpeaker.objects\ .filter(talk__conference=conference)\ .select_related('talk', 'speaker__user')\ .order_by('talk__created') if '@' in afilter: qs = qs.filter(speaker__user__email=afilter) elif '/' in afilter: d = datetime.strptime(afilter, '%Y/%m/%dT%H:%M:%S') qs = qs.filter(talk__created__gt=d) # more filters here... data = [] for row in qs: email = row.speaker.user.email ctx = { 'user': row.speaker.user, 'talk': row.talk, } if row.talk.type == 's': tpl = 'verify-talk-data' elif row.talk.type == 'p': tpl = 'verify-poster-data' elif row.talk.type == 't': tpl = 'verify-training-data' else: raise ValueError('unknown talk type') print email, '->', row.talk.title, '(%s)' % row.talk.type, row.talk.created data.append((email, ctx, tpl)) for email, ctx, tpl in data: utils.email(tpl, ctx, to=[email]).send()
def janrain_incomplete_profile(request): p = request.session['incomplete-profile'] try: name = p['displayName'] except KeyError: name = '%s %s' % (p['name'].get('givenName', ''), p['name'].get('familyName', '')) class Form(forms.Form): email = forms.EmailField() if request.method == 'POST': form = Form(data=request.POST) if form.is_valid(): email = form.cleaned_data['email'] payload = { 'email': email, 'profile': p, } token = models.Token.objects.create(ctype='j', payload=json.dumps(payload)) try: current = auth.models.User.objects.get(email=email) except auth.models.User.DoesNotExist: current = None utils.email( 'janrain-incomplete', ctx={ 'name': name, 'provider': p['providerName'], 'token': token, 'current': current, }, to=[email] ).send() del request.session['incomplete-profile'] return HttpResponseRedirectSeeOther(reverse('assopy-janrain-incomplete-profile-feedback')) else: form = Form() return { 'provider': p['providerName'], 'name': name, 'form': form, }
def janrain_incomplete_profile(request): p = request.session['incomplete-profile'] try: name = p['displayName'] except KeyError: name = '%s %s' % (p['name'].get('givenName', ''), p['name'].get( 'familyName', '')) class Form(forms.Form): email = forms.EmailField() if request.method == 'POST': form = Form(data=request.POST) if form.is_valid(): email = form.cleaned_data['email'] payload = { 'email': email, 'profile': p, } token = models.Token.objects.create(ctype='j', payload=json.dumps(payload)) current = autils.get_user_account_from_email(email, default=None) utils.email('janrain-incomplete', ctx={ 'name': name, 'provider': p['providerName'], 'token': token, 'current': current, }, to=[email]).send() del request.session['incomplete-profile'] return HttpResponseRedirectSeeOther( reverse('assopy-janrain-incomplete-profile-feedback')) else: form = Form() return { 'provider': p['providerName'], 'name': name, 'form': form, }
def on_refund_changed(sender, **kw): if sender.status == kw['old']: return if not kw['tickets']: return tpl = 'refund-' + sender.status from django.http import Http404 items = list(sender.items.all().select_related('order__user__user')) ctx = { 'items': items, 'name': items[0].order.user.name(), 'refund': sender, 'tickets': kw['tickets'], 'credit_note': sender.credit_note, } try: utils.email(tpl, ctx, to=[items[0].order.user.user.email]).send() except Http404: pass uid = items[0].order.user.user_id order = items[0].order mail_items = '\n'.join([ u' * %s - € %s' % (x.description, x.price) for x in items ]) if sender.status == 'pending': message = ''' User: %s (%s) Reason: %s Order: %s Items: %s Internal Notes: %s Manage link: %s ''' % ( ctx['name'], dsettings.DEFAULT_URL_PREFIX + reverse('admin:auth_user_change', args=(uid,)), sender.reason, order.code, mail_items, sender.internal_note, dsettings.DEFAULT_URL_PREFIX + reverse('admin:assopy_refund_change', args=(sender.id,)), ) send_email( subject='Refund request from %s' % ctx['name'], message=message, recipient_list=settings.REFUND_EMAIL_ADDRESS['approve'], ) elif sender.status == 'approved': message = ''' User: %s (%s) Order: %s Items: %s Payment method: %s Manage link: %s ''' % ( ctx['name'], dsettings.DEFAULT_URL_PREFIX + reverse('admin:auth_user_change', args=(uid,)), order.code, mail_items, order.method, dsettings.DEFAULT_URL_PREFIX + reverse('admin:assopy_refund_change', args=(sender.id,)), ) emails = settings.REFUND_EMAIL_ADDRESS['execute'] send_email( subject='Refund for %s approved' % ctx['name'], message=message, recipient_list=emails.get(order.method, emails[None]), ) elif sender.status == 'refunded': if settings.GENRO_BACKEND: message = ''' User: %s (%s) Order: %s assopy id: %s Items: %s Payment method: %s Manage link: %s ''' % ( ctx['name'], dsettings.DEFAULT_URL_PREFIX + reverse('admin:auth_user_change', args=(uid,)), order.code, order.assopy_id, mail_items, order.method, dsettings.DEFAULT_URL_PREFIX + reverse('admin:assopy_refund_change', args=(sender.id,)), ) send_email( subject='Refund for %s done, credit note needed' % ctx['name'], message=message, recipient_list=settings.REFUND_EMAIL_ADDRESS['credit-note'], ) else: sender.emit_credit_note()
def on_refund_changed(sender, **kw): if sender.status == kw['old']: return if not kw['tickets']: return tpl = 'refund-' + sender.status from django.http import Http404 items = list(sender.items.all().select_related('order__user__user')) ctx = { 'items': items, 'name': items[0].order.user.name(), 'refund': sender, 'tickets': kw['tickets'], 'credit_note': sender.credit_note, } try: utils.email(tpl, ctx, to=[items[0].order.user.user.email]).send() except Http404: pass uid = items[0].order.user.user_id order = items[0].order mail_items = '\n'.join([ u' * %s - € %s' % (x.description, x.price) for x in items ]) if sender.status == 'pending': message = ''' User: %s (%s) Reason: %s Order: %s Items: %s Internal Notes: %s Manage link: %s ''' % ( ctx['name'], dsettings.DEFAULT_URL_PREFIX + reverse('admin:auth_user_change', args=(uid,)), sender.reason, order.code, mail_items, sender.internal_note, dsettings.DEFAULT_URL_PREFIX + reverse('admin:assopy_refund_change', args=(sender.id,)), ) send_email( subject='Refund request from %s' % ctx['name'], message=message, recipient_list=settings.REFUND_EMAIL_ADDRESS['approve'], ) elif sender.status == 'approved': message = ''' User: %s (%s) Order: %s Items: %s Payment method: %s Manage link: %s ''' % ( ctx['name'], dsettings.DEFAULT_URL_PREFIX + reverse('admin:auth_user_change', args=(uid,)), order.code, mail_items, order.method, dsettings.DEFAULT_URL_PREFIX + reverse('admin:assopy_refund_change', args=(sender.id,)), ) emails = settings.REFUND_EMAIL_ADDRESS['execute'] send_email( subject='Refund for %s approved' % ctx['name'], message=message, recipient_list=emails.get(order.method, emails[None]), ) elif sender.status == 'refunded': sender.emit_credit_note()
def _assign_ticket(ticket, email): email = email.strip() try: recipient = auth.models.User.objects.get(email__iexact=email) except auth.models.User.DoesNotExist: try: # qui uso filter + [0] invece che .get perchè potrebbe accadere, # anche se non dovrebbe, che due identità abbiano la stessa email # (ad esempio se una persona a usato la stessa mail su più servizi # remoti ma ha collegato questi servizi a due utenti locali # diversi). Non è un problema se più identità hanno la stessa email # (nota che il backend di autenticazione già verifica che la stessa # email non venga usata due volte per creare utenti django) perché # in ogni caso si tratta di email verificate da servizi esterni. recipient = amodels.UserIdentity.objects.filter( email__iexact=email)[0].user.user except IndexError: recipient = None if recipient is None: from assopy.clients import genro rid = genro.users(email)['r0'] if rid is not None: # l'email non è associata ad un utente django ma genropy la # conosce. Se rid è assegnato ad un utente assopy riutilizzo # l'utente collegato. Questo check funziona quando un biglietto # viene assegnato ad un utente, quest'ultimo cambia email ma poi il # biglietto viene riassegnato nuovamente all'email originale. try: recipient = amodels.User.objects.get(assopy_id=rid).user except amodels.User.DoesNotExist: pass else: if recipient.email != email: log.info( 'email "%s" found on genropy; but user (%s) have a different email: "%s"', email.encode('utf-8'), unicode(recipient).encode('utf-8'), recipient.email.encode('utf-8')) email = recipient.email else: log.info('email "%s" found on genropy; user (%s)', email.encode('utf-8'), unicode(recipient).encode('utf-8')) if recipient is None: log.info('No user found for the email "%s"; time to create a new one', email) just_created = True u = amodels.User.objects.create_user(email=email, token=True, send_mail=False) recipient = u.user name = email else: log.info('Found a local user (%s) for the email "%s"', unicode(recipient).encode('utf-8'), email.encode('utf-8')) just_created = False try: auser = recipient.assopy_user except amodels.User.DoesNotExist: # uff, ho un utente su django che non è un assopy user, sicuramente # strascichi prima dell'introduzione dell'app assopy auser = amodels.User(user=recipient) auser.save() if not auser.token: recipient.assopy_user.token = str(uuid.uuid4()) recipient.assopy_user.save() name = '%s %s' % (recipient.first_name, recipient.last_name) _reset_ticket(ticket) utils.email( 'ticket-assigned', ctx={ 'name': name, 'just_created': just_created, 'ticket': ticket, 'link': settings.DEFAULT_URL_PREFIX + reverse('p3-user', kwargs={'token': recipient.assopy_user.token}), }, to=[email]).send() return email
def _assign_ticket(ticket, email): email = email.strip() try: recipient = autils.get_user_account_from_email(email) except auth.models.User.DoesNotExist: try: # Here I'm using filter + [0] instead of .get because it could happen, # even if it shouldn't, that two identities have the same email # (e.g. if someone used the same email on multiple remote services # but connected these services to two local users). # It's not a problem if more identities have the same email (note # that the authentication backend already checks that the same email # won't be used twice to create django users) because anway they're # email validated by external services. recipient = amodels.UserIdentity.objects.filter( email__iexact=email)[0].user.user except IndexError: recipient = None if recipient is None: log.info('No user found for the email "%s"; time to create a new one', email) just_created = True u = amodels.User.objects.create_user(email=email, token=True, send_mail=False) recipient = u.user name = email else: log.info('Found a local user (%s) for the email "%s"', unicode(recipient).encode('utf-8'), email.encode('utf-8')) just_created = False try: auser = recipient.assopy_user except amodels.User.DoesNotExist: # doh... this django user is not an assopy user, surely something # coming from before the introduction of assopy app. auser = amodels.User(user=recipient) auser.save() if not auser.token: recipient.assopy_user.token = str(uuid.uuid4()) recipient.assopy_user.save() name = '%s %s' % (recipient.first_name, recipient.last_name) _reset_ticket(ticket) # Set new ticket name ticket.name = name ticket.save() utils.email( 'ticket-assigned', ctx={ 'name': name, 'just_created': just_created, 'ticket': ticket, 'link': settings.DEFAULT_URL_PREFIX + reverse('p3-user', kwargs={'token': recipient.assopy_user.token}), }, to=[email]).send() return email
def _assign_ticket(ticket, email): email = email.strip() try: recipient = auth.models.User.objects.get(email__iexact=email) except auth.models.User.DoesNotExist: try: # Here I'm using filter + [0] instead of .get because it could happen, # even if it shouldn't, that two identities have the same email # (e.g. if someone used the same email on multiple remote services # but connected these services to two local users). # It's not a problem if more identities have the same email (note # that the authentication backend already checks that the same email # won't be used twice to create django users) because anway they're # email validated by external services. recipient = amodels.UserIdentity.objects.filter(email__iexact=email)[0].user.user except IndexError: recipient = None if recipient is None: from assopy.clients import genro rid = genro.users(email)['r0'] if rid is not None: # the email it's not associated to a django user, but genropy # knows it. If rid is assigned to an assopy user I'll reuse the # connected user. This check works when the ticket is assigned # to a user, the user modifies its email but later the ticket # is reassigned to the original email. try: recipient = amodels.User.objects.get(assopy_id=rid).user except amodels.User.DoesNotExist: pass else: if recipient.email != email: log.info( 'email "%s" found on genropy; but user (%s) have a different email: "%s"', email.encode('utf-8'), unicode(recipient).encode('utf-8'), recipient.email.encode('utf-8')) email = recipient.email else: log.info( 'email "%s" found on genropy; user (%s)', email.encode('utf-8'), unicode(recipient).encode('utf-8')) if recipient is None: log.info('No user found for the email "%s"; time to create a new one', email) just_created = True u = amodels.User.objects.create_user(email=email, token=True, send_mail=False) recipient = u.user name = email else: log.info('Found a local user (%s) for the email "%s"', unicode(recipient).encode('utf-8'), email.encode('utf-8')) just_created = False try: auser = recipient.assopy_user except amodels.User.DoesNotExist: # doh... this django user is not an assopy user, surely something # coming from before the introduction of assopy app. auser = amodels.User(user=recipient) auser.save() if not auser.token: recipient.assopy_user.token = str(uuid.uuid4()) recipient.assopy_user.save() name = '%s %s' % (recipient.first_name, recipient.last_name) _reset_ticket(ticket) utils.email( 'ticket-assigned', ctx={ 'name': name, 'just_created': just_created, 'ticket': ticket, 'link': settings.DEFAULT_URL_PREFIX + reverse('p3-user', kwargs={'token': recipient.assopy_user.token}), }, to=[email] ).send() return email
def _assign_ticket(ticket, email): email = email.strip() try: recipient = auth.models.User.objects.get(email__iexact=email) except auth.models.User.DoesNotExist: try: # qui uso filter + [0] invece che .get perchè potrebbe accadere, # anche se non dovrebbe, che due identità abbiano la stessa email # (ad esempio se una persona a usato la stessa mail su più servizi # remoti ma ha collegato questi servizi a due utenti locali # diversi). Non è un problema se più identità hanno la stessa email # (nota che il backend di autenticazione già verifica che la stessa # email non venga usata due volte per creare utenti django) perché # in ogni caso si tratta di email verificate da servizi esterni. recipient = amodels.UserIdentity.objects.filter(email__iexact=email)[0].user.user except IndexError: recipient = None if recipient is None: from assopy.clients import genro rid = genro.users(email)['r0'] if rid is not None: # l'email non è associata ad un utente django ma genropy la # conosce. Se rid è assegnato ad un utente assopy riutilizzo # l'utente collegato. Questo check funziona quando un biglietto # viene assegnato ad un utente, quest'ultimo cambia email ma poi il # biglietto viene riassegnato nuovamente all'email originale. try: recipient = amodels.User.objects.get(assopy_id=rid).user except amodels.User.DoesNotExist: pass else: if recipient.email != email: log.info( 'email "%s" found on genropy; but user (%s) have a different email: "%s"', email.encode('utf-8'), unicode(recipient).encode('utf-8'), recipient.email.encode('utf-8')) email = recipient.email else: log.info( 'email "%s" found on genropy; user (%s)', email.encode('utf-8'), unicode(recipient).encode('utf-8')) if recipient is None: log.info('No user found for the email "%s"; time to create a new one', email) just_created = True u = amodels.User.objects.create_user(email=email, token=True, send_mail=False) recipient = u.user name = email else: log.info('Found a local user (%s) for the email "%s"', unicode(recipient).encode('utf-8'), email.encode('utf-8')) just_created = False try: auser = recipient.assopy_user except amodels.User.DoesNotExist: # uff, ho un utente su django che non è un assopy user, sicuramente # strascichi prima dell'introduzione dell'app assopy auser = amodels.User(user=recipient) auser.save() if not auser.token: recipient.assopy_user.token = str(uuid.uuid4()) recipient.assopy_user.save() name = '%s %s' % (recipient.first_name, recipient.last_name) _reset_ticket(ticket) utils.email( 'ticket-assigned', ctx={ 'name': name, 'just_created': just_created, 'ticket': ticket, 'link': settings.DEFAULT_URL_PREFIX + reverse('p3-user', kwargs={'token': recipient.assopy_user.token}), }, to=[email] ).send() return email
def _assign_ticket(ticket, email): email = email.strip() try: recipient = auth.models.User.objects.get(email__iexact=email) except auth.models.User.DoesNotExist: try: # Here I'm using filter + [0] instead of .get because it could happen, # even if it shouldn't, that two identities have the same email # (e.g. if someone used the same email on multiple remote services # but connected these services to two local users). # It's not a problem if more identities have the same email (note # that the authentication backend already checks that the same email # won't be used twice to create django users) because anway they're # email validated by external services. recipient = amodels.UserIdentity.objects.filter( email__iexact=email)[0].user.user except IndexError: recipient = None if recipient is None: from assopy.settings import GENRO_BACKEND if GENRO_BACKEND: from assopy.clients import genro rid = genro.users(email)['r0'] if rid is not None: # the email it's not associated to a django user, but genropy # knows it. If rid is assigned to an assopy user I'll reuse the # connected user. This check works when the ticket is assigned # to a user, the user modifies its email but later the ticket # is reassigned to the original email. try: recipient = amodels.User.objects.get(assopy_id=rid).user except amodels.User.DoesNotExist: pass else: if recipient.email != email: log.info( 'email "%s" found on genropy; but user (%s) have a different email: "%s"', email.encode('utf-8'), unicode(recipient).encode('utf-8'), recipient.email.encode('utf-8')) email = recipient.email else: log.info('email "%s" found on genropy; user (%s)', email.encode('utf-8'), unicode(recipient).encode('utf-8')) if recipient is None: log.info('No user found for the email "%s"; time to create a new one', email) just_created = True u = amodels.User.objects.create_user(email=email, token=True, send_mail=False) recipient = u.user name = email else: log.info('Found a local user (%s) for the email "%s"', unicode(recipient).encode('utf-8'), email.encode('utf-8')) just_created = False try: auser = recipient.assopy_user except amodels.User.DoesNotExist: # doh... this django user is not an assopy user, surely something # coming from before the introduction of assopy app. auser = amodels.User(user=recipient) auser.save() if not auser.token: recipient.assopy_user.token = str(uuid.uuid4()) recipient.assopy_user.save() name = '%s %s' % (recipient.first_name, recipient.last_name) _reset_ticket(ticket) utils.email( 'ticket-assigned', ctx={ 'name': name, 'just_created': just_created, 'ticket': ticket, 'link': settings.DEFAULT_URL_PREFIX + reverse('p3-user', kwargs={'token': recipient.assopy_user.token}), }, to=[email]).send() return email