Beispiel #1
0
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()
Beispiel #2
0
 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
Beispiel #3
0
    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
Beispiel #4
0
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)
Beispiel #5
0
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)
Beispiel #6
0
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)
Beispiel #7
0
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()
Beispiel #8
0
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()
Beispiel #9
0
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()
Beispiel #10
0
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()
Beispiel #11
0
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()
Beispiel #12
0
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()
Beispiel #13
0
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()
Beispiel #14
0
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()
Beispiel #15
0
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()
Beispiel #16
0
    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 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()
Beispiel #18
0
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,
    }
Beispiel #19
0
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,
    }
Beispiel #20
0
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()
Beispiel #21
0
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()
Beispiel #22
0
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
Beispiel #23
0
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
Beispiel #24
0
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
Beispiel #25
0
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
Beispiel #26
0
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