コード例 #1
0
ファイル: views.py プロジェクト: joneskoo/sikteeri
def alias_add_for_member(request, id, template_name='membership/membership_add_alias.html'):
    membership = get_object_or_404(Membership, id=id)

    class Form(ModelForm):
        class Meta:
            model = Alias
            exclude = ('owner', 'account', 'expiration_date')

    if request.method == 'POST':
        form = Form(request.POST)
        if form.is_valid():
            f = form.cleaned_data
            name = f['name']
            comment = f['comment']
            alias = Alias(owner=membership, name=name, comment=comment)
            alias.save()
            messages.success(request,
                _('Alias {alias} successfully created for {membership}.'
                  '').format(alias=alias, membership=membership))
            logger.info("Alias %s added by %s." % (alias, request.user.username))
            return redirect('membership_edit', membership.id)
    else:
        form = Form()

    return render_to_response(template_name,
                              {'form': form,
                               'membership': membership },
                              context_instance=RequestContext(request))
コード例 #2
0
def alias_add_for_member(request, id, template_name='membership/membership_add_alias.html'):
    membership = get_object_or_404(Membership, id=id)
    class Form(ModelForm):
        class Meta:
            model = Alias
            exclude = ('owner', 'account', 'expiration_date')

    if request.method == 'POST':
        form = Form(request.POST)
        if form.is_valid():
            f = form.cleaned_data
            name = f['name']
            comment = f['comment']
            alias = Alias(owner=membership, name=name, comment=comment)
            alias.save()
            messages.success(request, unicode(_('Alias %s successfully created for %s.') % (alias, membership)))
            logger.info("Alias %s added by %s." % (alias, request.user.username))
            return redirect('membership_edit', membership.id)
    else:
        form = Form()

    return render_to_response(template_name,
                              {'form': form,
                               'membership': membership },
                              context_instance=RequestContext(request))
コード例 #3
0
ファイル: generate_test_data.py プロジェクト: guaq/sikteeri
    def create_dummy_member(self, i, duplicate_of=None):
        fname = random_first_name()
        d = {
            'street_address' : 'Testikatu %d'%i,
            'postal_code' : '%d' % (i+1000),
            'post_office' : 'Paska kaupunni',
            'country' : 'Finland',
            'phone' : "%09d" % (40123000 + i),
            'sms' : "%09d" % (40123000 + i),
            'email' : '*****@*****.**' % i,
            'homepage' : 'http://www.example.com/%d'%i,
            'first_name' : fname,
            'given_names' : '%s %s' % (fname, "Kapsi"),
            'last_name' : random_last_name(),
        }

        if duplicate_of is not None:
            d['first_name'] = duplicate_of.person.first_name
            d['last_name'] = duplicate_of.person.last_name

        person = Contact(**d)
        person.save()
        membership = Membership(type='P', status='N',
                                person=person,
                                nationality='Finnish',
                                municipality='Paska kaupunni',
                                extra_info='Hintsunlaisesti semmoisia tietoja.')

        self.stdout.write(unicode(person))
        membership.save()

        forward_alias = Alias(owner=membership,
                              name=Alias.email_forwards(membership)[0])
        forward_alias.save()


        login_alias = Alias(owner=membership, account=True,
                            name=choice(Alias.unix_logins(membership)))
        login_alias.save()

        # Services
        forward_alias_service = Service(servicetype=ServiceType.objects.get(servicetype='Email alias'),
                                        alias=forward_alias, owner=membership, data=forward_alias.name)
        forward_alias_service.save()

        unix_account_service = Service(servicetype=ServiceType.objects.get(servicetype='UNIX account'),
                                       alias=login_alias, owner=membership, data=login_alias.name)
        unix_account_service.save()

        if random() < 0.6:
            mysql_service = Service(servicetype=ServiceType.objects.get(servicetype='MySQL database'),
                                    alias=login_alias, owner=membership, data=login_alias.name.replace('-', '_'))
            mysql_service.save()
        if random() < 0.6:
            postgresql_service = Service(servicetype=ServiceType.objects.get(servicetype='PostgreSQL database'),
                                         alias=login_alias, owner=membership, data=login_alias.name)
            postgresql_service.save()
        # End of services

        logger.info("New application %s from %s:." % (str(person), '::1'))
        return membership
コード例 #4
0
ファイル: views.py プロジェクト: Wraithh/sikteeri
def organization_application_save(request):
    try:
        membership = Membership(type='O', status='N',
                                nationality=request.session['membership']['nationality'],
                                municipality=request.session['membership']['municipality'],
                                extra_info=request.session['membership']['extra_info'])

        organization = Contact(**request.session['organization'])

        try:
            billing_contact = Contact(**request.session['billing_contact'])
        except:
            billing_contact = None

        try:
            tech_contact = Contact(**request.session['tech_contact'])
        except:
            tech_contact = None

        organization.save()
        membership.organization = organization
        if billing_contact:
            billing_contact.save()
            membership.billing_contact = billing_contact
        if tech_contact:
            tech_contact.save()
            membership.tech_contact = tech_contact

        membership.save()

        services = []
        session = request.session
        login_alias = Alias(owner=membership, name=session['services']['unix_login'], account=True)
        login_alias.save()
        unix_account_service = Service(servicetype=ServiceType.objects.get(servicetype='UNIX account'),
                                       alias=login_alias, owner=membership, data=session['services']['unix_login'])
        unix_account_service.save()
        services.append(unix_account_service)
        if session['services'].has_key('mysql_database'):
            mysql_service = Service(servicetype=ServiceType.objects.get(servicetype='MySQL database'),
                                    alias=login_alias, owner=membership,
                                    data=session['services']['mysql_database'].replace('-', '_'))
            mysql_service.save()
            services.append(mysql_service)
        if session['services'].has_key('postgresql_database'):
            postgresql_service = Service(servicetype=ServiceType.objects.get(servicetype='PostgreSQL database'),
                                         alias=login_alias, owner=membership,
                                         data=session['services']['postgresql_database'])
            postgresql_service.save()
            services.append(postgresql_service)
        if session['services'].has_key('login_vhost'):
            login_vhost_service = Service(servicetype=ServiceType.objects.get(servicetype='WWW vhost'),
                                          alias=login_alias, owner=membership,
                                          data=session['services']['login_vhost'])
            login_vhost_service.save()
            services.append(login_vhost_service)

        transaction.commit()

        send_mail(_('Membership application received'),
                  render_to_string('membership/application_confirmation.txt',
                                   { 'membership': membership,
                                     'membership_type': MEMBER_TYPES_DICT[membership.type],
                                     'organization': membership.organization,
                                     'billing_contact': membership.billing_contact,
                                     'tech_contact': membership.tech_contact,
                                     'ip': request.META['REMOTE_ADDR'],
                                     'services': services}),
                  settings.FROM_EMAIL,
                  [membership.email_to()], fail_silently=False)

        logger.info("New application %s from %s:." % (unicode(organization), request.META['REMOTE_ADDR']))
        request.session.set_expiry(0) # make this expire when the browser exits
        for i in ['membership', 'billing_contact', 'tech_contact', 'services']:
            try:
                del request.session[i]
            except:
                pass
        return redirect('new_organization_application_success')
    except Exception, e:
        transaction.rollback()
        logger.error("%s" % traceback.format_exc())
        logger.error("Transaction rolled back.")
        return redirect('new_application_error')
コード例 #5
0
ファイル: views.py プロジェクト: Wraithh/sikteeri
def person_application(request, template_name='membership/new_person_application.html'):
    if settings.MAINTENANCE_MESSAGE != None:
        return redirect('frontpage')
    chosen_email_forward = None
    if request.method != 'POST':
        application_form = PersonApplicationForm()
    elif request.method == 'POST':
        application_form = PersonApplicationForm(request.POST)

        if not application_form.is_valid():
            try:
                chosen_email_forward = application_form.fields['email_forward'].clean(application_form.data['email_forward'])
            except:
                pass
        else:
            f = application_form.cleaned_data
            try:
                # Separate a contact dict from the other fields
                contact_dict = {}
                for k, v in f.items():
                    if k not in ['nationality', 'municipality',
                                 'public_memberlist', 'email_forward',
                                 'unix_login', 'extra_info',
                                 'mysql_database', 'postgresql_database',
                                 'login_vhost']:
                        contact_dict[k] = v

                person = Contact(**contact_dict)
                person.save()
                membership = Membership(type='P', status='N',
                                        person=person,
                                        nationality=f['nationality'],
                                        municipality=f['municipality'],
                                        public_memberlist=f['public_memberlist'],
                                        extra_info=f['extra_info'])
                membership.save()

                # Service handling
                services = []

                login_alias = Alias(owner=membership, name=f['unix_login'], account=True)
                login_alias.save()
                unix_account_service = Service(servicetype=ServiceType.objects.get(servicetype='UNIX account'),
                                               alias=login_alias, owner=membership, data=f['unix_login'])
                unix_account_service.save()
                services.append(unix_account_service)

                if f['email_forward'] != 'no' and f['email_forward'] != f['unix_login']:
                    forward_alias = Alias(owner=membership, name=f['email_forward'])
                    forward_alias.save()
                    forward_alias_service = Service(servicetype=ServiceType.objects.get(servicetype='Email alias'),
                                                    alias=forward_alias, owner=membership, data=f['unix_login'])
                    forward_alias_service.save()
                    services.append(forward_alias_service)

                if f['mysql_database'] == True:
                    mysql_service = Service(servicetype=ServiceType.objects.get(servicetype='MySQL database'),
                                            alias=login_alias, owner=membership, data=f['unix_login'].replace('-', '_'))
                    mysql_service.save()
                    services.append(mysql_service)
                if f['postgresql_database'] == True:
                    postgresql_service = Service(servicetype=ServiceType.objects.get(servicetype='PostgreSQL database'),
                                                 alias=login_alias, owner=membership, data=f['unix_login'])
                    postgresql_service.save()
                    services.append(postgresql_service)
                if f['login_vhost'] == True:
                    login_vhost_service = Service(servicetype=ServiceType.objects.get(servicetype='WWW vhost'),
                                                  alias=login_alias, owner=membership, data=f['unix_login'])
                    login_vhost_service.save()
                    services.append(login_vhost_service)

                logger.debug("Attempting to save with the following services: %s." % ", ".join((str(service) for service in services)))
                # End of services
                transaction.commit()
                logger.info("New application %s from %s:." % (str(person), request.META['REMOTE_ADDR']))
                send_mail(_('Membership application received'),
                          render_to_string('membership/application_confirmation.txt',
                                           { 'membership': membership,
                                             'membership_type': MEMBER_TYPES_DICT[membership.type],
                                             'person': membership.person,
                                             'billing_contact': membership.billing_contact,
                                             'tech_contact': membership.tech_contact,
                                             'ip': request.META['REMOTE_ADDR'],
                                             'services': services}),
                          settings.FROM_EMAIL,
                          [membership.email_to()], fail_silently=False)
                return redirect('new_person_application_success')
            except Exception, e:
                transaction.rollback()
                logger.critical("%s" % traceback.format_exc())
                logger.critical("Transaction rolled back while trying to process %s." % repr(application_form.cleaned_data))
                return redirect('new_application_error')
コード例 #6
0
def create_member(mdata, logins):
    # legacy fields
    # ['application_id', 'sendinfo', 'memberclass', 'applicationtime', 'sms',
    # 'id', 'email', 'website', 'publicwebsite', 'lastname', 'phone',
    # 'firstnames', 'address', 'nationality', 'post', 'removed', 'publicname',
    # 'name', 'mobile', 'residence', 'time', 'publicemail', 'period_start',
    # 'period_end']
    # TODO: latest billing period start date?
    post_index = mdata['post'].find(' ')
    postcode = mdata['post'][:post_index]
    postoffice = mdata['post'][post_index+1:]
    d = {
        'street_address' : mdata['address'],
        'postal_code' : postcode,
        'post_office' : postoffice,
        'country' : mdata['nationality'],
        'phone' : mdata['phone'].replace(" ", "").replace("-", ""),
        'sms' : mdata['sms'].replace(" ", "").replace("-", ""),
        'email' : mdata['email'].strip(" "),
        'homepage' : mdata['website'].strip(" "),
        'first_name' : mdata['name'].strip(" "),
        'given_names' : mdata['firstnames'].strip(" "),
        'last_name' : mdata['lastname'].strip(" "),
        # mdata['application_id'],
        # mdata['sendinfo'],
    }

    # Hide non-public websites
    if not mdata['publicwebsite']:
        d['homepage'] = ""

    if not mdata['memberclass']:
        mtype = 'P'
        print >> sys.stderr, "# Member type missing for member %d" % mdata['id']
    elif mdata['memberclass'] == 'member':
        mtype = 'P'
    elif mdata['memberclass'] == 'supporting':
        mtype = 'S'
    elif mdata['memberclass'] == 'organization':
        mtype = 'O'
    elif mdata['memberclass'] == 'honorary':
        mtype = 'H'
    else:
        print >> sys.stderr, "! Not importing, member class unknown for member %d" % mdata['id']
        return False

    contact = Contact(**d)
    contact.save()
    if mtype == 'O':
        membership = Membership(id=mdata['id'], type=mtype, status='A',
                                created=datetime.utcfromtimestamp(mdata['time']),
                                approved=datetime.utcfromtimestamp(mdata['time']),
                                organization=contact,
                                nationality=mdata['nationality'],
                                municipality=mdata['residence'],
                                extra_info='Imported from legacy',
                                public_memberlist=bool(mdata['publicname']))
    else:
        membership = Membership(id=mdata['id'], type=mtype, status='A',
                                created=datetime.utcfromtimestamp(mdata['time']),
                                approved=datetime.utcfromtimestamp(mdata['time']),
                                person=contact,
                                nationality=mdata['nationality'],
                                municipality=mdata['residence'],
                                extra_info='Imported from legacy',
                                public_memberlist=bool(mdata['publicname']))
    logger.info("Member %s imported from legacy database." % (unicode(contact)))
    membership.save()

    # Create a period only if there already is one previously. Else let
    # makebills create one.
    if mdata.has_key('period_start'):
        billing_cycle = BillingCycle(membership=membership, is_paid=False,
                                     start=datetime.strptime(mdata['period_start'], "%Y-%m-%d %H:%M:%S"),
                                     end=datetime.strptime(mdata['period_end'], "%Y-%m-%d %H:%M:%S")+timedelta(days=1))
        billing_cycle.save()
        bill = Bill(billingcycle=billing_cycle)
        bill.save()
        # Due to auto_now_add, need to save first before changing
        bill.created=datetime.strptime(mdata['bill_creation'], "%Y-%m-%d %H:%M:%S")
        bill.due_date=datetime.strptime(mdata['bill_dueday'], "%Y-%m-%d %H:%M:%S")
        bill.save()
    for alias in mdata['aliases']:
        if alias in logins:
            a = Alias(owner=membership, name=alias, account=True,
                      created=membership.created)
        else:
            a = Alias(owner=membership, name=alias, account=False,
                      created=membership.created)
        a.save()

        account_alias_count = Alias.objects.filter(owner=a.owner, account=True).count()
        if account_alias_count > 1:
            logger.warning("%i account aliases for %s" % (account_alias_count, a.owner))

    log_change(membership, user, change_message="Imported into system")
    return True
コード例 #7
0
ファイル: views.py プロジェクト: salomatu/sikteeri
def person_application(request,
                       template_name='membership/new_person_application.html'):
    if settings.MAINTENANCE_MESSAGE != None:
        return redirect('frontpage')
    chosen_email_forward = None
    if request.method != 'POST':
        application_form = PersonApplicationForm()
    elif request.method == 'POST':
        application_form = PersonApplicationForm(request.POST)

        if not application_form.is_valid():
            try:
                chosen_email_forward = application_form.fields[
                    'email_forward'].clean(
                        application_form.data['email_forward'])
            except:
                pass
        else:
            f = application_form.cleaned_data
            try:
                # Separate a contact dict from the other fields
                contact_dict = {}
                for k, v in f.items():
                    if k not in [
                            'nationality', 'municipality', 'public_memberlist',
                            'email_forward', 'unix_login', 'extra_info',
                            'mysql_database', 'postgresql_database',
                            'login_vhost'
                    ]:
                        contact_dict[k] = v

                person = Contact(**contact_dict)
                person.save()
                membership = Membership(
                    type='P',
                    status='N',
                    person=person,
                    nationality=f['nationality'],
                    municipality=f['municipality'],
                    public_memberlist=f['public_memberlist'],
                    extra_info=f['extra_info'])
                membership.save()

                # Service handling
                services = []

                login_alias = Alias(owner=membership,
                                    name=f['unix_login'],
                                    account=True)
                login_alias.save()
                unix_account_service = Service(
                    servicetype=ServiceType.objects.get(
                        servicetype='UNIX account'),
                    alias=login_alias,
                    owner=membership,
                    data=f['unix_login'])
                unix_account_service.save()
                services.append(unix_account_service)

                if f['email_forward'] != 'no' and f['email_forward'] != f[
                        'unix_login']:
                    forward_alias = Alias(owner=membership,
                                          name=f['email_forward'])
                    forward_alias.save()
                    forward_alias_service = Service(
                        servicetype=ServiceType.objects.get(
                            servicetype='Email alias'),
                        alias=forward_alias,
                        owner=membership,
                        data=f['unix_login'])
                    forward_alias_service.save()
                    services.append(forward_alias_service)

                if f['mysql_database'] == True:
                    mysql_service = Service(
                        servicetype=ServiceType.objects.get(
                            servicetype='MySQL database'),
                        alias=login_alias,
                        owner=membership,
                        data=f['unix_login'].replace('-', '_'))
                    mysql_service.save()
                    services.append(mysql_service)
                if f['postgresql_database'] == True:
                    postgresql_service = Service(
                        servicetype=ServiceType.objects.get(
                            servicetype='PostgreSQL database'),
                        alias=login_alias,
                        owner=membership,
                        data=f['unix_login'])
                    postgresql_service.save()
                    services.append(postgresql_service)
                if f['login_vhost'] == True:
                    login_vhost_service = Service(
                        servicetype=ServiceType.objects.get(
                            servicetype='WWW vhost'),
                        alias=login_alias,
                        owner=membership,
                        data=f['unix_login'])
                    login_vhost_service.save()
                    services.append(login_vhost_service)

                logger.debug(
                    "Attempting to save with the following services: %s." %
                    ", ".join((str(service) for service in services)))
                # End of services
                transaction.commit()
                logger.info("New application %s from %s:." %
                            (str(person), request.META['REMOTE_ADDR']))
                send_mail(
                    _('Membership application received'),
                    render_to_string(
                        'membership/application_confirmation.txt', {
                            'membership': membership,
                            'membership_type':
                            MEMBER_TYPES_DICT[membership.type],
                            'person': membership.person,
                            'billing_contact': membership.billing_contact,
                            'tech_contact': membership.tech_contact,
                            'ip': request.META['REMOTE_ADDR'],
                            'services': services
                        }),
                    settings.FROM_EMAIL, [membership.email_to()],
                    fail_silently=False)
                return redirect('new_person_application_success')
            except Exception, e:
                transaction.rollback()
                logger.critical("%s" % traceback.format_exc())
                logger.critical(
                    "Transaction rolled back while trying to process %s." %
                    repr(application_form.cleaned_data))
                return redirect('new_application_error')
コード例 #8
0
ファイル: views.py プロジェクト: salomatu/sikteeri
def organization_application_save(request):
    try:
        membership = Membership(
            type='O',
            status='N',
            nationality=request.session['membership']['nationality'],
            municipality=request.session['membership']['municipality'],
            extra_info=request.session['membership']['extra_info'])

        organization = Contact(**request.session['organization'])

        try:
            billing_contact = Contact(**request.session['billing_contact'])
        except:
            billing_contact = None

        try:
            tech_contact = Contact(**request.session['tech_contact'])
        except:
            tech_contact = None

        organization.save()
        membership.organization = organization
        if billing_contact:
            billing_contact.save()
            membership.billing_contact = billing_contact
        if tech_contact:
            tech_contact.save()
            membership.tech_contact = tech_contact

        membership.save()

        services = []
        session = request.session
        login_alias = Alias(owner=membership,
                            name=session['services']['unix_login'],
                            account=True)
        login_alias.save()
        unix_account_service = Service(
            servicetype=ServiceType.objects.get(servicetype='UNIX account'),
            alias=login_alias,
            owner=membership,
            data=session['services']['unix_login'])
        unix_account_service.save()
        services.append(unix_account_service)
        if session['services'].has_key('mysql_database'):
            mysql_service = Service(
                servicetype=ServiceType.objects.get(
                    servicetype='MySQL database'),
                alias=login_alias,
                owner=membership,
                data=session['services']['mysql_database'].replace('-', '_'))
            mysql_service.save()
            services.append(mysql_service)
        if session['services'].has_key('postgresql_database'):
            postgresql_service = Service(
                servicetype=ServiceType.objects.get(
                    servicetype='PostgreSQL database'),
                alias=login_alias,
                owner=membership,
                data=session['services']['postgresql_database'])
            postgresql_service.save()
            services.append(postgresql_service)
        if session['services'].has_key('login_vhost'):
            login_vhost_service = Service(
                servicetype=ServiceType.objects.get(servicetype='WWW vhost'),
                alias=login_alias,
                owner=membership,
                data=session['services']['login_vhost'])
            login_vhost_service.save()
            services.append(login_vhost_service)

        transaction.commit()

        send_mail(
            _('Membership application received'),
            render_to_string(
                'membership/application_confirmation.txt', {
                    'membership': membership,
                    'membership_type': MEMBER_TYPES_DICT[membership.type],
                    'organization': membership.organization,
                    'billing_contact': membership.billing_contact,
                    'tech_contact': membership.tech_contact,
                    'ip': request.META['REMOTE_ADDR'],
                    'services': services
                }),
            settings.FROM_EMAIL, [membership.email_to()],
            fail_silently=False)

        logger.info("New application %s from %s:." %
                    (unicode(organization), request.META['REMOTE_ADDR']))
        request.session.set_expiry(
            0)  # make this expire when the browser exits
        for i in ['membership', 'billing_contact', 'tech_contact', 'services']:
            try:
                del request.session[i]
            except:
                pass
        return redirect('new_organization_application_success')
    except Exception, e:
        transaction.rollback()
        logger.error("%s" % traceback.format_exc())
        logger.error("Transaction rolled back.")
        return redirect('new_application_error')
コード例 #9
0
    def create_dummy_member(self, i, duplicate_of=None):
        fname = random_first_name()
        d = {
            'street_address': 'Testikatu %d' % i,
            'postal_code': '%d' % (i + 1000),
            'post_office': 'Paska kaupunni',
            'country': 'Finland',
            'phone': "%09d" % (40123000 + i),
            'sms': "%09d" % (40123000 + i),
            'email': '*****@*****.**' % i,
            'homepage': 'http://www.example.com/%d' % i,
            'first_name': fname,
            'given_names': '%s %s' % (fname, "Kapsi"),
            'last_name': random_last_name(),
        }

        if duplicate_of is not None:
            d['first_name'] = duplicate_of.person.first_name
            d['last_name'] = duplicate_of.person.last_name

        person = Contact(**d)
        person.save()
        if random() < 0.2:
            public_memberlist = True
        else:
            public_memberlist = False
        membership = Membership(
            type='P',
            status='N',
            person=person,
            nationality='Finnish',
            municipality='Paska kaupunni',
            public_memberlist=public_memberlist,
            extra_info='Hintsunlaisesti semmoisia tietoja.')

        self.stdout.write(unicode(person))
        membership.save()

        forward_alias = Alias(owner=membership,
                              name=Alias.email_forwards(membership)[0])
        forward_alias.save()

        login_alias = Alias(owner=membership,
                            account=True,
                            name=choice(Alias.unix_logins(membership)))
        login_alias.save()

        # Services
        forward_alias_service = Service(
            servicetype=ServiceType.objects.get(servicetype='Email alias'),
            alias=forward_alias,
            owner=membership,
            data=forward_alias.name)
        forward_alias_service.save()

        unix_account_service = Service(
            servicetype=ServiceType.objects.get(servicetype='UNIX account'),
            alias=login_alias,
            owner=membership,
            data=login_alias.name)
        unix_account_service.save()

        if random() < 0.6:
            mysql_service = Service(servicetype=ServiceType.objects.get(
                servicetype='MySQL database'),
                                    alias=login_alias,
                                    owner=membership,
                                    data=login_alias.name.replace('-', '_'))
            mysql_service.save()
        if random() < 0.6:
            postgresql_service = Service(servicetype=ServiceType.objects.get(
                servicetype='PostgreSQL database'),
                                         alias=login_alias,
                                         owner=membership,
                                         data=login_alias.name)
            postgresql_service.save()
        # End of services

        logger.info("New application %s from %s:." % (str(person), '::1'))
        return membership
コード例 #10
0
    def create_dummy_member(self, i, duplicate_of=None):
        fname = random_first_name()
        d = {
            "street_address": "Testikatu %d" % i,
            "postal_code": "%d" % (i + 1000),
            "post_office": "Paska kaupunni",
            "country": "Finland",
            "phone": "%09d" % (40123000 + i),
            "sms": "%09d" % (40123000 + i),
            "email": "*****@*****.**" % i,
            "homepage": "http://www.example.com/%d" % i,
            "first_name": fname,
            "given_names": "%s %s" % (fname, "Kapsi"),
            "last_name": random_last_name(),
        }

        if duplicate_of is not None:
            d["first_name"] = duplicate_of.person.first_name
            d["last_name"] = duplicate_of.person.last_name

        person = Contact(**d)
        person.save()
        if random() < 0.2:
            public_memberlist = True
        else:
            public_memberlist = False
        membership = Membership(
            type="P",
            status="N",
            person=person,
            nationality="Finnish",
            municipality="Paska kaupunni",
            public_memberlist=public_memberlist,
            extra_info="Hintsunlaisesti semmoisia tietoja.",
        )

        self.stdout.write(unicode(person))
        membership.save()

        forward_alias = Alias(owner=membership, name=Alias.email_forwards(membership)[0])
        forward_alias.save()

        login_alias = Alias(owner=membership, account=True, name=choice(Alias.unix_logins(membership)))
        login_alias.save()

        # Services
        forward_alias_service = Service(
            servicetype=ServiceType.objects.get(servicetype="Email alias"),
            alias=forward_alias,
            owner=membership,
            data=forward_alias.name,
        )
        forward_alias_service.save()

        unix_account_service = Service(
            servicetype=ServiceType.objects.get(servicetype="UNIX account"),
            alias=login_alias,
            owner=membership,
            data=login_alias.name,
        )
        unix_account_service.save()

        if random() < 0.6:
            mysql_service = Service(
                servicetype=ServiceType.objects.get(servicetype="MySQL database"),
                alias=login_alias,
                owner=membership,
                data=login_alias.name.replace("-", "_"),
            )
            mysql_service.save()
        if random() < 0.6:
            postgresql_service = Service(
                servicetype=ServiceType.objects.get(servicetype="PostgreSQL database"),
                alias=login_alias,
                owner=membership,
                data=login_alias.name,
            )
            postgresql_service.save()
        # End of services

        logger.info("New application %s from %s:." % (str(person), "::1"))
        return membership