Exemple #1
0
def expire_members():
    types = MemberType.all().fetch(30)
    expired_type = None
    for mt in types:
        if mt.name == MEMBER_TYPE_EXPIRED:
            expired_type = mt
            break
    if not expired_type:
        print 'Could not find member type for expired members'

    members = Member.all().fetch(3000)
    expired_count = 0
    last_year = datetime.datetime.now().year - 1
    for member in members:
        dues = MembershipDues.all().ancestor(member).fetch(30)
        all_paid = False
        for due in dues:
            if due.year >= last_year and due.paid:
                all_paid = True
                break
        if not all_paid and member.membertype.name == DEFAULT_MEMBER_NAME and member.status.name == DEFAULT_MEMBER_STATUS_NAME:
            print 'Member no', member.number, 'has an expired membership'
            member.membertype = expired_type
            member.put()
            expired_count = expired_count + 1

    print expired_count, 'memberships have been ended'
    def report_task(self):
        diff = datetime.timedelta(days=150)
        cutoff_date = datetime.date.today() - diff

        filename = self.get_filename(self.id())
        member_list = Member.all().fetch(LIMIT_ALL)

        lines = list()
        lines.append("number;name;zip;city;date;bil\n")
        for member in member_list:
            if member.member_since >= cutoff_date and member.status.name == "Medlem":
                cars = member.cars.fetch(1)
                if len(cars) > 0:
                    model = cars[0].model.name
                else:
                    model = ""
                lines.append(
                    '"%s";"%s";"%s";"%s";"%s";"%s"\n'
                    % (
                        unicode(member.number),
                        unicode(member.name),
                        unicode(member.zipcode),
                        unicode(member.city),
                        member.member_since.isoformat(),
                        model,
                    )
                )

        self.write_report(filename, lines)
def nonone():
    """ Mass update fields set to 'None'. Please don't ask. """
    for member in Member.all().fetch(10000):
        mod = False
        if member.email == 'None':
            member.email = None
            mod = True

        if member.phone == 'None':
            member.phone = None
            mod = True

        if member.phone_work == 'None':
            member.phone_work = None
            mod = True

        if member.phone_home == 'None':
            member.phone_home = None
            mod = True

        if member.address == 'None':
            member.address = None
            mod = True

        if mod:
            member.put()
Exemple #4
0
    def nonone(self):
        """ Mass update fields set to 'None'. Please don't ask. """
        for member in Member.all().fetch(3000):
            mod = False
            if member.email == 'None':
                member.email = None
                mod = True

            if member.phone == 'None':
                member.phone = None
                mod = True

            if member.phone_work == 'None':
                member.phone_work = None
                mod = True

            if member.phone_home == 'None':
                member.phone_home = None
                mod = True

            if member.address == 'None':
                member.address = None
                mod = True

            if mod:
                member.put()
Exemple #5
0
def expire_members():
    types = MemberType.all().fetch(30)
    expired_type = None
    for mt in types:
        if mt.name == MEMBER_TYPE_EXPIRED:
            expired_type = mt
            break
    if not expired_type:
        print 'Could not find member type for expired members'

    members = Member.all().fetch(3000)
    expired_count = 0
    last_year = datetime.datetime.now().year - 1
    for member in members:
        dues = MembershipDues.all().ancestor(member).fetch(30)
        all_paid = False
        for due in dues:
            if due.year >= last_year and due.paid:
                all_paid = True
                break
        if not all_paid and member.membertype.name == DEFAULT_MEMBER_NAME and member.status.name == DEFAULT_MEMBER_STATUS_NAME:
            print 'Member no', member.number, 'has an expired membership'
            member.membertype = expired_type
            member.put()
            expired_count = expired_count + 1

    print expired_count, 'memberships have been ended'
Exemple #6
0
def create_new_member_no():
    """Assign new member no. Not *that* time critical but some form of
    transactions would be nice. Or required. This makes my hair stand up
    but...

    It works."""

    members = Member.all().order('-number').fetch(1)
    return str(int(members[0].number) + 1)
Exemple #7
0
def do_index_verification():
	member_list = Member.all().fetch(LIMIT_ALL)
	index = search.Index(name='members')
	for member in member_list:
		query =

		result = index.search(query=search.Query('number:' + member.number, options=search.QueryOptions(limit=10)))
		logging.debug('Found ' + str(len(result))) + ' members with number ' + member.number
		
def create_new_member_no():
    """Assign new member no. Not *that* time critical but some form of
    transactions would be nice. Or required. This makes my hair stand up
    but...

    It works."""

    members = Member.all().order('-number').fetch(1)
    return str(int(members[0].number) + 1)
Exemple #9
0
 def create_index(self):
     print 'Creating member index'
     members = Member.all().fetch(10000)
     docs = []
     for member in members:
         print 'Indexing member',member.number
         docs.append(member.create_document())
         if len(docs) > 100:
             index = search.Index(name='members')
             index.put(docs)
             docs = []
Exemple #10
0
 def create_index(self):
     print 'Creating member index'
     members = Member.all().fetch(10000)
     docs = []
     for member in members:
         print 'Indexing member', member.number
         docs.append(member.create_document())
         if len(docs) > 100:
             index = search.Index(name='members')
             index.put(docs)
             docs = []
Exemple #11
0
    def create_member_car(self, car, range_name, model_name, note):
        members = Member.all().filter('number', car.memberno).fetch(10)
        if len(members) == 0:
            print 'WARNING: Could not look up member with no.', car.memberno
            return

        member_car = Car()
        member_car.member = members[0]
        member_car.model = self.get_model(model_name)
        member_car.registration = car.registration
        member_car.year = int(car.year)
        member_car.notes = note
        member_car.serial_no = ''
        member_car.put()
Exemple #12
0
    def create_member_car(self, car, range_name, model_name, note):
        members = Member.all().filter('number',car.memberno).fetch(10)
        if len(members) == 0:
            print 'WARNING: Could not look up member with no.',car.memberno
            return

        member_car = Car()
        member_car.member = members[0]
        member_car.model = self.get_model(model_name)
        member_car.registration = car.registration
        member_car.year = int(car.year)
        member_car.notes = note
        member_car.serial_no = ''
        member_car.put()
Exemple #13
0
    def report_task(self):
        filename = self.get_filename(self.id())
        member_list = Member.all().fetch(LIMIT_ALL)

        lines = list()
        lines.append('number;name;address;zip;city;country;type\n')
        for member in member_list:
            typename = member.membertype.name
            if typename == u'Medlem' or typename == u'Hedersmedlem':
                lines.append('"%s";"%s";"%s";"%s";"%s";"%s";"%s"\n' % (
                    unicode(member.number), unicode(member.name), unicode(member.address),
                    unicode(member.zipcode), unicode(member.city), unicode(member.country.name),
                    typename))

        self.write_report(filename, lines, 'cp1252')
Exemple #14
0
    def index_verification(self):
        logging.info('Retrieving member list')
        member_list = Member.all().fetch(10000)
        logging.info('Found ' + str(len(member_list)) + ' members')
        index = search.Index(name='members')
        for member in member_list:
            try:
                result = index.search(query=search.Query('number:' + member.number, options=search.QueryOptions(limit=10)))
                if not result.results:
                    logging.warning('Found no entry for member with number ' + member.number + '. Adding to index')
                    member.update_index()

            except ex:
                logging.warning('Got exception ex ' + ex)            
        logging.info('Completed verification')
Exemple #15
0
    def report_task(self):
        filename = self.get_filename(self.id())
        member_list = Member.all().fetch(LIMIT_ALL)

        lines = list()
        lines.append('number;name;address;zip;city;country;edit_code;fee;type;magazine_count\n')
        for member in member_list:
            typename = member.membertype.name
            count = (member.magazine_count if member.magazine_count else 1)
            if typename == u'Medlem' or \
                typename == u'Alfanytt' or typename == u'Hedersmedlem':
                lines.append('"%s";"%s";"%s";"%s";"%s";"%s";"%s";%d;"%s";%d\n' % (
                    unicode(member.number), unicode(member.name), unicode(member.address),
                    unicode(member.zipcode), unicode(member.city), unicode(member.country.name),
                    unicode(member.edit_access_code), member.membertype.fee, typename, count))

        self.write_report(filename, lines, 'cp1252')
Exemple #16
0
    def report_task(self):
        filename = self.get_filename(self.id())
        member_list = Member.all().fetch(LIMIT_ALL)
        current_year = datetime.datetime.now().year
        final_list = list()

        for member in member_list:
            # Skip if the member doesn't pay fees
            if member.membertype.fee == 0:
                continue

            # Retrieve dues and check if status is set to paid
            dues = MembershipDues.all().ancestor(member).fetch(YEAR_MAX)
            paid = False
            for due in dues:
                if due.year == current_year:
                    paid = due.paid
                    break
            if not paid:
                final_list.append(member)

        # Make CSV file
        lines = list()
        lines.append(
            'number;name;address;zip;city;country;email;phone;member_since;type;status\n'
        )
        for member in final_list:
            datestr = ''
            if member.member_since:
                datestr = member.member_since.strftime('%Y-%m-%d')
            phonestr = ''
            if member.phone and member.phone != 'None':
                phonestr = unicode(member.phone)
            emailstr = ''
            if member.email and member.email != 'None':
                emailstr = unicode(member.email)
            lines.append(
                '"%s";"%s";"%s";"%s";"%s";"%s";"%s";"%s";%s;"%s";"%s"\n' %
                (unicode(member.number), unicode(member.name),
                 unicode(member.address), unicode(member.zipcode),
                 unicode(member.city), unicode(
                     member.country.name), emailstr, phonestr, datestr,
                 unicode(member.membertype.name), unicode(member.status.name)))

        self.write_report(filename, lines)
Exemple #17
0
    def index_verification(self):
        logging.info('Retrieving member list')
        member_list = Member.all().fetch(10000)
        logging.info('Found ' + str(len(member_list)) + ' members')
        index = search.Index(name='members')
        for member in member_list:
            try:
                result = index.search(
                    query=search.Query('number:' + member.number,
                                       options=search.QueryOptions(limit=10)))
                if not result.results:
                    logging.warning('Found no entry for member with number ' +
                                    member.number + '. Adding to index')
                    member.update_index()

            except ex:
                logging.warning('Got exception ex ' + ex)
        logging.info('Completed verification')
Exemple #18
0
    def report_task(self):
        filename = self.get_filename(self.id())
        member_list = Member.all().fetch(LIMIT_ALL)

        lines = list()
        lines.append('number;name;address;zip;city;country;edit_code;fee;type\n')
        for member in member_list:
            typename = member.membertype.name
            if typename == u'Medlem' or \
                typename == u'Alfanytt' or typename == u'Hedersmedlem':
                count = (member.magazine_count if member.magazine_count else 1)
                for n in range(0, count):
                    lines.append('"%s";"%s";"%s";"%s";"%s";"%s";"%s";%d;"%s"\n' % (
                        unicode(member.number), unicode(member.name), unicode(member.address),
                        unicode(member.zipcode), unicode(member.city), unicode(member.country.name),
                        unicode(member.edit_access_code), member.membertype.fee, typename))

        self.write_report(filename, lines, 'cp1252')
Exemple #19
0
    def report_task(self):
        filename = self.get_filename(self.id())
        member_list = Member.all().fetch(LIMIT_ALL)
        current_year = datetime.datetime.now().year
        final_list = list()

        for member in member_list:
            # Skip if the member doesn't pay fees
            if member.membertype.fee == 0:
                continue

            # Retrieve dues and check if status is set to paid
            dues = MembershipDues.all().ancestor(member).fetch(YEAR_MAX)
            paid = False
            for due in dues:
                if due.year == current_year:
                    paid = due.paid
                    break
            if not paid:
                final_list.append(member)

        # Make CSV file
        lines = list()
        lines.append(
            'number;name;address;zip;city;country;email;phone;member_since;type;status\n')
        for member in final_list:
            datestr = ''
            if member.member_since:
                datestr = member.member_since.strftime('%Y-%m-%d')
            phonestr = ''
            if member.phone and member.phone != 'None':
                phonestr = unicode(member.phone)
            emailstr = ''
            if member.email and member.email != 'None':
                emailstr = unicode(member.email)
            lines.append('"%s";"%s";"%s";"%s";"%s";"%s";"%s";"%s";%s;"%s";"%s"\n' % (
                unicode(member.number), unicode(
                    member.name), unicode(member.address),
                unicode(member.zipcode), unicode(
                    member.city), unicode(member.country.name),
                emailstr, phonestr, datestr,
                unicode(member.membertype.name), unicode(member.status.name)))

        self.write_report(filename, lines)
Exemple #20
0
    def report_task(self):
        filename = self.get_filename(self.id())
        member_list = Member.all().fetch(LIMIT_ALL)

        current_year = datetime.datetime.now().year
        year_range = range(current_year - 3, current_year + 3)

        lines = list()
        lines.append('number;name;address;zip;city;country;type;email;phone')
        for year in year_range:
            lines.append(';fee' + str(year))
        lines.append('\n')

        for member in member_list:
            typename = member.membertype.name
            emailstr = ''
            if member.email and member.email != 'None':
                emailstr = unicode(member.email)
            phonestr = ''
            if member.phone and member.phone != 'None':
                phonestr = unicode(member.phone)

            lines.append('"%s";"%s";"%s";"%s";"%s";"%s";"%s";"%s";"%s"' %
                         (unicode(member.number), unicode(member.name),
                          unicode(member.address), unicode(member.zipcode),
                          unicode(member.city), unicode(member.country.name),
                          typename, emailstr, phonestr))
            due_list = {}
            for year in year_range:
                due_list['year' + str(year)] = 0

            for due in MembershipDues.all().ancestor(member).fetch(YEAR_MAX):
                key = 'year' + str(due.year)
                if key in due_list:
                    if due.paid:
                        due_list[key] = 1

            for year in year_range:
                lines.append(';' + str(due_list['year' + str(year)]))

            lines.append('\n')

        self.write_report(filename, lines, 'cp1252')
 def create_index(self):
     """Create a new index"""
     members = Member.all().fetch(20000)
     docs = []
     count = 0
     for member in members:
         try:
             docs.append(member.create_document())
             if len(docs) > 100:
                 index = search.Index(name='members')
                 index.put(docs)
                 docs = []
             count = count + 1
         except Exception as ex:
             logging.warning('Got exception ex %s', ex)
     if len(docs) > 0:
         index = search.Index(name='members')
         index.put(docs)
         docs = []
     logging.info('Reindexed %d members', count)
Exemple #22
0
 def create_index(self):
     """Create a new index"""
     members = Member.all().fetch(20000)
     docs = []
     count = 0
     for member in members:
         try:
             docs.append(member.create_document())
             if len(docs) > 100:
                 index = search.Index(name='members')
                 index.put(docs)
                 docs = []
             count = count + 1
         except Exception as ex:
             logging.warning('Got exception ex %s', ex)
     if len(docs) > 0:
         index = search.Index(name='members')
         index.put(docs)
         docs = []
     logging.info('Reindexed %d members', count)
Exemple #23
0
def expire_members():
    logging.info('Expiring memberships')
    types = MemberType.all().fetch(10000)
    expired_type = None
    for mt in types:
        if mt.name == MEMBER_TYPE_EXPIRED:
            expired_type = mt
            break
    if not expired_type:
        logging.info(
            'Could not find member type for expired members. Exiting.')
        return

    members = Member.all().fetch(10000)
    expired_count = 0
    this_year = datetime.datetime.now().year
    total = 0
    for member in members:
        total = total + 1
        dues = MembershipDues.all().ancestor(member).filter(
            'year', this_year).fetch(100)
        all_paid = False
        for due in dues:
            #logging.info('%s: Y: %s, paid: %s' % (member.number, due.year, due.paid))
            if not all_paid and due.year == this_year and due.paid:
                all_paid = True
                # print 'All paid for %s ' % (member.number)

        if not all_paid:
            if member.membertype.name == DEFAULT_MEMBER_NAME:
                if member.status.name == DEFAULT_MEMBER_STATUS_NAME:
                    print(
                        'Member no %s has an expired membership (type is %s, status is %s); new type will be %s'
                        % (member.number, member.membertype.name,
                           member.status.name, expired_type.name))

                    member.membertype = expired_type
                    member.put()
                    expired_count = expired_count + 1

    print('%d memberships of %d will be expired' % (expired_count, total))
Exemple #24
0
    def report_task(self):
        diff = datetime.timedelta(days=150)
        cutoff_date = datetime.date.today() - diff

        filename = self.get_filename(self.id())
        member_list = Member.all().fetch(LIMIT_ALL)

        lines = list()
        lines.append('number;name;zip;city;date;bil\n')
        for member in member_list:
            if member.member_since >= cutoff_date and member.status.name == 'Medlem':
                cars = member.cars.fetch(1)
                if cars:
                    model = cars[0].model.name
                else:
                    model = ''
                lines.append('"%s";"%s";"%s";"%s";"%s";"%s"\n' %
                             (unicode(member.number), unicode(member.name),
                              unicode(member.zipcode), unicode(member.city),
                              member.member_since.isoformat(), model))

        self.write_report(filename, lines)
Exemple #25
0
    def post(self):
        # User (tries to) log in. Check member no and access code.
        try:
            memberno = self.get_required('memberno')
            access_code = self.get_required('accesscode')

            members = Member.all().filter('number', memberno).fetch(1)
            if len (members) < 1:
                self.abort(400)

            if members[0].edit_access_code.lower() != access_code:
                self.abort(400)

            self.create_cookie(memberno, access_code)

            return self.redirect('profile/' + str(members[0].key()) + '/edit')

        except Exception as ex:
            print 'Got exception:',ex
            # bounce to login page
            self.response.delete_cookie(COOKIE_NAME)
            return self.redirect('profile')
Exemple #26
0
    def report_task(self):
        filename = self.get_filename(self.id())
        member_list = Member.all().fetch(LIMIT_ALL)

        current_year = datetime.datetime.now().year
        year_range = range(current_year - 3, current_year + 3)

        lines = list()
        lines.append('number;name;address;zip;city;country;type;email')
        for year in year_range:
            lines.append(';fee' + str(year))
        lines.append('\n')

        for member in member_list:
            typename = member.membertype.name
            emailstr = ''
            if member.email and member.email != 'None':
                emailstr = unicode(member.email)
            lines.append('"%s";"%s";"%s";"%s";"%s";"%s";"%s";"%s"' % (
                unicode(member.number), unicode(member.name), unicode(member.address),
                unicode(member.zipcode), unicode(member.city), unicode(member.country.name),
                typename, emailstr))
            due_list  = {}
            for year in year_range:
                due_list['year' + str(year)] = 0

            for due in MembershipDues.all().ancestor(member).fetch(YEAR_MAX):
                key = 'year' + str(due.year)
                if key in due_list:
                    if due.paid:
                        due_list[key] = 1

            for year in year_range:
                lines.append(';' + str(due_list['year' + str(year)]))

            lines.append('\n')

        self.write_report(filename, lines, 'cp1252')
Exemple #27
0
def expire_members():
    logging.info('Expiring memberships')
    types = MemberType.all().fetch(10000)
    expired_type = None
    for mt in types:
        if mt.name == MEMBER_TYPE_EXPIRED:
            expired_type = mt
            break
    if not expired_type:
        logging.info(
            'Could not find member type for expired members. Exiting.')
        return

    members = Member.all().fetch(10000)
    expired_count = 0
    this_year = datetime.datetime.now().year
    total = 0
    for member in members:
        total = total + 1
        dues = MembershipDues.all().ancestor(member).filter('year', this_year).fetch(100)
        all_paid = False
        for due in dues:
            #logging.info('%s: Y: %s, paid: %s' % (member.number, due.year, due.paid))
            if not all_paid and due.year == this_year and due.paid:
                all_paid = True
                # print 'All paid for %s ' % (member.number)

        if not all_paid:
            if member.membertype.name == DEFAULT_MEMBER_NAME:
                if member.status.name == DEFAULT_MEMBER_STATUS_NAME:
                    print ('Member no %s has an expired membership (type is %s, status is %s); new type will be %s' %
                           (member.number, member.membertype.name, member.status.name, expired_type.name))

                    member.membertype = expired_type
                    member.put()
                    expired_count = expired_count + 1

    print ('%d memberships of %d will be expired' % (expired_count, total))
Exemple #28
0
    def post(self):
        complete = []
        incomplete = []
        values = {}

        # Holy crap this is ugly. There has to be a better way.

        name = self.request.get('name')
        if not name or name.strip() == '' or name.strip().startswith('http'):
            incomplete.append('name')
        else:
            values['name'] = name
            complete.append('name')

        address = self.request.get('address')
        # Spammers put URLs in the address field so we reject those right away
        if not address or address.strip() == '' or address.strip().startswith(
                'http'):
            incomplete.append('address')
        else:
            values['address'] = address
            complete.append('address')

        zipcode = self.request.get('zip')
        if (not zipcode or zipcode.strip() == '') or len(zipcode.strip()) < 4:
            incomplete.append('zip')
        else:
            values['zip'] = zipcode
            complete.append('zip')

        city = self.request.get('city')
        if not city or city.strip() == '':
            incomplete.append('city')
        else:
            values['city'] = city
            complete.append('city')

        if 'zip' in incomplete or 'city' in incomplete:
            incomplete.append('zipcity')

        country_key = self.request.get('country').strip()
        country = Country.get(country_key)

        countries = Country.all().order('order').fetch(100)

        if not country or not country_key or country_key.strip() == '':
            incomplete.append('country')
            # retrieve countries since we're going to need them
        else:
            values['country'] = country.name
            complete.append('country')

        email = self.request.get('email')
        if not email or email.strip() == '' or not mail.is_email_valid(email):
            incomplete.append('email')
        else:
            values['email'] = email
            complete.append('email')

        mobile = self.request.get('mobile')
        if mobile and mobile.strip() == '':
            mobile = None
        values['mobile'] = mobile

        home = self.request.get('home')
        if home and home.strip() == '':
            home = None
        values['home'] = home

        work = self.request.get('work')
        if work and work.strip() == '':
            work = None
        values['work'] = work

        member_type = self.request.get('type')
        if not member_type or member_type.strip() == '':
            member_type = '1'

        types = MemberType.all().fetch(100)

        mtype = None

        # TODO: Custom settings? Constants at least.
        if member_type == '1':
            mtype = next(t for t in types if t.name == DEFAULT_MEMBER_NAME)
        else:
            mtype = next(t for t in types
                         if t.name == DEFAULT_SUPPORT_MEMBER_NAME)

        values['type'] = mtype.name
        comment = self.request.get('comment')
        complete.append('comment')
        values['comment'] = comment

        error_message = ''

        # Check if member exists;
        existing = Member.all().filter('email', email).fetch(1)

        if len(existing) > 0:
            incomplete.append('email')
            error_message = 'Det er allerede registrert noen i medlemsregisteret med denne epostadressen!'
            # TODO: Error message

        if len(incomplete) > 0:
            # missing field, redirect to signup page again
            template = JINJA_ENVIRONMENT.get_template(
                'templates/selfservice/signup.html')
            return self.response.write(
                template.render({
                    'countries': countries,
                    'incomplete': incomplete,
                    'complete': complete,
                    'error_message': error_message,
                    'values': values
                }))

        # invariant: fields are OK, create new member, send mail,
        # create payment history on member.
        template = JINJA_ENVIRONMENT.get_template(
            'templates/selfservice/signup_receipt.html')
        data = {'values': values, 'profile_url': PROFILE_URL}

        statuses = Status.all().fetch(100)

        # TODO: Handle existing members signing up again

        new_member = Member()

        new_member.name = name
        new_member.address = address
        new_member.zipcode = zipcode
        new_member.city = city
        new_member.notes = comment
        new_member.country = country
        new_member.membertype = mtype

        status = next(s for s in statuses if s.name == SIGNUP_STATUS_NAME)
        new_member.status = status

        new_member.number = dbutils.create_new_member_no()

        new_member.email = email
        new_member.member_since = datetime.date.today()
        if mobile:
            new_member.phone = mobile
        if work:
            new_member.phone_work = work
        if home:
            new_member.phone_home = home
        new_member.generate_access_code()
        new_member.member_since = datetime.date.today()
        new_member.member_type = mtype
        new_member.put()
        new_member.update_index()

        self.send_welcome_mail(new_member)
        self.send_notification_mails(new_member)

        # TODO: Invalidate counts for categories
        # Handle mutations on members gracefully

        return self.response.write(template.render(data))
Exemple #29
0
    def post(self):
        complete = []
        incomplete = []
        values = {}

        # Holy crap this is ugly. There has to be a better way.

        name = self.request.get('name')
        if not name or name.strip() == '':
            incomplete.append('name')
        else:
            values['name'] = name
            complete.append('name')


        address = self.request.get('address')
        if not address or address.strip() == '':
            incomplete.append('address')
        else:
            values['address'] = address
            complete.append('address')


        zipcode = self.request.get('zip')
        if (not zipcode or zipcode.strip() == '') or len(zipcode.strip()) < 4:
            incomplete.append('zip')
        else:
            values['zip'] = zipcode
            complete.append('zip')


        city = self.request.get('city')
        if not city or city.strip() == '':
            incomplete.append('city')
        else:
            values['city'] = city
            complete.append('city')

        if 'zip' in incomplete or 'city' in incomplete:
            incomplete.append('zipcity')


        country_key = self.request.get('country').strip()
        country = Country.get(country_key)

        countries = Country.all().order('order').fetch(100)

        if not country or not country_key or country_key.strip() == '':
            incomplete.append('country')
            # retrieve countries since we're going to need them
        else:
            values['country'] = country.name
            complete.append('country')

        email = self.request.get('email')
        if not email or email.strip() == '' or not mail.is_email_valid(email):
            incomplete.append('email')
        else:
            values['email'] = email
            complete.append('email')

        mobile = self.request.get('mobile')
        if mobile and mobile.strip() == '':
            mobile = None
        values['mobile'] = mobile

        home = self.request.get('home')
        if home and home.strip() == '':
            home = None
        values['home'] = home

        work = self.request.get('work')
        if work and work.strip() == '':
            work = None
        values['work'] = work

        member_type = self.request.get('type')
        if not member_type or member_type.strip() == '':
            member_type = '1'

        types = MemberType.all().fetch(100)

        mtype = None

        # TODO: Custom settings? Constants at least.
        if member_type == '1':
            mtype = next(t for t in types if t.name == DEFAULT_MEMBER_NAME)
        else:
            mtype = next(t for t in types if t.name == DEFAULT_SUPPORT_MEMBER_NAME)

        values['type'] = mtype.name
        comment = self.request.get('comment')
        complete.append('comment')
        values['comment'] = comment

        error_message = ''

        # Check if member exists;
        existing = Member.all().filter('email', email).fetch(1)

        if len(existing) > 0:
            incomplete.append('email')
            error_message = 'Det er allerede registrert noen i medlemsregisteret med denne epostadressen!'
            # TODO: Error message

        if len(incomplete) > 0:
            # missing field, redirect to signup page again
            template = JINJA_ENVIRONMENT.get_template('templates/selfservice/signup.html')
            return self.response.write(template.render({
                'countries': countries,
                'incomplete': incomplete,
                'complete': complete,
                'error_message': error_message,
                'values': values }))

        # invariant: fields are OK, create new member, send mail,
        # create payment history on member.
        template = JINJA_ENVIRONMENT.get_template('templates/selfservice/signup_receipt.html')
        data = {
            'values': values,
            'profile_url': PROFILE_URL
        }

        statuses = Status.all().fetch(100)

        # TODO: Handle existing members signing up again

        new_member = Member()

        new_member.name = name
        new_member.address = address
        new_member.zipcode = zipcode
        new_member.city = city
        new_member.notes = comment
        new_member.country = country
        new_member.membertype = mtype

        status = next(s for s in statuses if s.name == SIGNUP_STATUS_NAME)
        new_member.status = status

        new_member.number = dbutils.create_new_member_no()

        new_member.email = email
        new_member.member_since = datetime.date.today()
        if mobile:
            new_member.phone = mobile
        if work:
            new_member.phone_work = work
        if home:
            new_member.phone_home = home
        new_member.generate_access_code()
        new_member.member_since = datetime.date.today()
        new_member.member_type = mtype
        new_member.put()

        self.send_welcome_mail(new_member)
        self.send_notification_mails(new_member)

        # TODO: Invalidate counts for categories
        # Handle mutations on members gracefully

        return self.response.write(template.render(data))
Exemple #30
0
def generate_edit_codes():
    """ Mass update edit codes for members """
    for member in Member.all().fetch(10000):
        member.generate_access_code()
        member.put()