def import_(): user = UserPrefs.current() if not user.canImport(): return "denied", 403 breadcrumbs = [{ 'link': '/', 'text': 'Hem' }, { 'link': '/import', 'text': 'Import' }] groupid = "" apikey = "" if user.groupaccess is not None: scoutgroup = user.groupaccess.get() apikey = scoutgroup.apikey_all_members groupid = scoutgroup.scoutnetID if request.method == 'POST': apikey = request.form.get('apikey').strip() groupid = request.form.get('groupid').strip() semester_key = Semester.getOrCreateCurrent().key return startAsyncImport(apikey, groupid, semester_key, user, request) return render_template('updatefromscoutnetform.html', heading="Import", breadcrumbs=breadcrumbs, user=user, groupid=groupid, apikey=apikey)
def import_(): user = UserPrefs.current() if not user.canImport(): return "denied", 403 breadcrumbs = [{ 'link': '/', 'text': 'Hem' }, { 'link': '/import', 'text': 'Import' }] currentSemester = Semester.getOrCreateCurrent() semesters = [currentSemester] semesters.extend(Semester.query(Semester.key != currentSemester.key)) if request.method != 'POST': return render_template('updatefromscoutnetform.html', heading="Import", breadcrumbs=breadcrumbs, user=user, semesters=semesters) api_key = request.form.get('apikey').strip() groupid = request.form.get('groupid').strip() semester_key = ndb.Key(urlsafe=request.form.get('semester')) return startAsyncImport(api_key, groupid, semester_key, user, request)
def dosettroopsemester(): semester_key = Semester.getOrCreateCurrent().key troops = Troop.query().fetch() for troop in troops: #if troop.semester_key != semester_key: troop.semester_key = semester_key logging.info("updating semester for: %s", troop.getname()) troop.put()
def setcurrentsemester(): user = UserPrefs.current() if not user.isAdmin(): return "denied", 403 semester = Semester.getOrCreateCurrent() for u in UserPrefs.query().fetch(): u.activeSemester = semester.key u.put() return redirect('/admin/')
def show(sgroup_url): user = UserPrefs.current() if not user.canImport(): return "denied", 403 breadcrumbs = [{'link': '/', 'text': 'Hem'}] baselink = "/scoutgroupinfo/" section_title = "Kårinformation" scoutgroup = None if sgroup_url is not None: sgroup_key = ndb.Key(urlsafe=sgroup_url) scoutgroup = sgroup_key.get() baselink += sgroup_url + "/" breadcrumbs.append({'link': baselink, 'text': scoutgroup.getname()}) if request.method == "POST": logging.info("POST, %s" % str(request.form)) scoutgroup.organisationsnummer = request.form[ 'organisationsnummer'].strip() scoutgroup.foreningsID = request.form['foreningsID'].strip() scoutgroup.scoutnetID = request.form['scoutnetID'].strip() scoutgroup.kommunID = request.form['kommunID'].strip() scoutgroup.apikey_waitinglist = request.form[ 'apikey_waitinglist'].strip() scoutgroup.apikey_all_members = request.form[ 'apikey_all_members'].strip() scoutgroup.bankkonto = request.form['bankkonto'].strip() scoutgroup.adress = request.form['adress'].strip() scoutgroup.postadress = request.form['postadress'].strip() scoutgroup.epost = request.form['epost'].strip() scoutgroup.telefon = request.form['telefon'].strip() scoutgroup.default_lagerplats = request.form['lagerplats'].strip() scoutgroup.firmatecknare = request.form['firmatecknare'].strip() scoutgroup.firmatecknartelefon = request.form[ 'firmatecknartelefon'].strip() scoutgroup.firmatecknaremail = request.form['firmatecknaremail'].strip( ) scoutgroup.attendance_min_year = request.form.get( 'attendance_min_year', type=int) scoutgroup.attendance_incl_hike = request.form.get( 'attendance_incl_hike') == 'on' scoutgroup.put() if "import" in request.form: return startAsyncImport(scoutgroup.apikey_all_members, scoutgroup.scoutnetID, Semester.getOrCreateCurrent().key, user, request) else: return redirect(breadcrumbs[-1]['link']) else: return render_template('scoutgroupinfo.html', heading=section_title, baselink=baselink, scoutgroup=scoutgroup, breadcrumbs=breadcrumbs)
def scoutgroupsummary(sgroup_url): user = UserPrefs.current() if not user.canImport(): return "denied", 403 if sgroup_url is None: return "missing group", 404 if user.activeSemester is None: semester = Semester.getOrCreateCurrent() else: semester = user.activeSemester.get() sgroup_key = ndb.Key(urlsafe=sgroup_url) scoutgroup = sgroup_key.get() breadcrumbs = [{'link':'/', 'text':'Hem'}] baselink = "/groupsummary/" + sgroup_url section_title = "Föreningsredovisning - " + scoutgroup.getname() breadcrumbs.append({'link':baselink, 'text':section_title}) class Item(): age = 0 women = 0 womenMeetings = 0 men = 0 menMeetings = 0 def __init__(self, age, women=0, womenMeetings=0, men=0, menMeetings=0): self.age = age self.women = women self.womenMeetings = womenMeetings self.men = men self.menMeetings = menMeetings year = semester.year women = 0 womenMeetings = 0 men = 0 menMeetings = 0 startage = 7 endage = 25 ages = [Item('0 - 6')] ages.extend([Item(i) for i in range(startage, endage+1)]) ages.append(Item('26 - 64')) ages.append(Item('65 -')) leaders = [Item(u't.o.m. 25 år'), Item(u'över 25 år')] boardmebers = [Item('')] from_date_time = datetime.datetime.strptime(str(semester.year) + "-01-01 00:00", "%Y-%m-%d %H:%M") to_date_time = datetime.datetime.strptime(str(semester.year) + "-12-31 00:00", "%Y-%m-%d %H:%M") emails = [] for person in Person.query(Person.scoutgroup==sgroup_key).fetch(): if person.member_years is None or semester.year not in person.member_years: continue if person.email is not None and len(person.email) != 0 and person.email not in emails: emails.append(person.email) age = person.getyearsoldthisyear(year) if scoutgroup.attendance_incl_hike: number_of_meetings = Meeting.query(Meeting.attendingPersons==person.key, Meeting.datetime >= from_date_time, Meeting.datetime <= to_date_time).count() else: meetings = Meeting.query(Meeting.attendingPersons==person.key, Meeting.datetime >= from_date_time, Meeting.datetime <= to_date_time) nr_all = meetings.count() nr_hike_meetings = meetings.filter(Meeting.ishike == True).count() number_of_meetings = nr_all - nr_hike_meetings index = 0 if 7 <= age <= 25: index = age-startage + 1 elif age < 7: index = 0 elif 26 <= age <= 64: index = endage - startage + 2 else: index = endage - startage + 3 if person.isFemale(): women += 1 ages[index].women += 1 else: men += 1 ages[index].men += 1 if number_of_meetings >= scoutgroup.attendance_min_year: if person.isFemale(): womenMeetings += 1 ages[index].womenMeetings += 1 else: menMeetings += 1 ages[index].menMeetings += 1 if person.isBoardMember(): if person.isFemale(): boardmebers[0].women += 1 else: boardmebers[0].men += 1 if person.isLeader() and number_of_meetings > 1: index = 0 if age <= 25 else 1 if person.isFemale(): leaders[index].women += 1 else: leaders[index].men += 1 ages.append(Item("Totalt", women, womenMeetings, men, menMeetings)) return render_template('groupsummary.html', ages=ages, boardmebers=boardmebers, leaders=leaders, breadcrumbs=breadcrumbs, emails=emails, year=semester.year, min_nr_meetings=str(scoutgroup.attendance_min_year), incl_hikes=scoutgroup.attendance_incl_hike)
def merge_scout_group(oldname, newname, commit, taskProgress, user, move_users, move_persons, move_troops, delete_sg, semester_id): start_time = time.time() oldsg = ScoutGroup.getbyname(oldname) if oldsg is None: raise RuntimeError("Old sg name:%s not found" % oldname) newsg = ScoutGroup.getbyname(newname) if newsg is None: raise RuntimeError("New sg name:%s not found" % newname) if not commit: taskProgress.info("*** testmode ***") keys_to_delete = [] entities_to_put_first = [] entities_to_put = [] taskProgress.info("termin: %s" % semester_id) convertsemester = Semester.getbyId(semester_id) if convertsemester is None: taskProgress.error("termin: %s does not exist" % semester_id) currentsemester = Semester.getOrCreateCurrent() if move_users: taskProgress.info("Update all users to the new scoutgroup") for u in UserPrefs.query(UserPrefs.groupaccess == oldsg.key).fetch(): logging.info(" * * moving user for %s" % (u.getname())) u.groupaccess = newsg.key u.activeSemester = currentsemester.key entities_to_put.append(u) if move_persons: taskProgress.info("Moving all persons to the new ScoutGroup:%s" % newsg.getname()) for oldp in Person.query(Person.scoutgroup == oldsg.key).fetch(): oldp.scoutgroup = newsg.key entities_to_put.append(oldp) if move_troops: taskProgress.info("Move all troops to the new ScoutGroup:%s, semester: %s" % (newsg.getname(), convertsemester.getname())) for oldt in Troop.query(Troop.scoutgroup == oldsg.key, Troop.semester_key == convertsemester.key).fetch(): taskProgress.info(" * found old troop for %s, semester=%s" % (str(oldt.key.id()), oldt.semester_key.get().getname())) keys_to_delete.append(oldt.key) newt = Troop.get_by_id(Troop.getid(oldt.scoutnetID, newsg.key, oldt.semester_key), use_memcache=True) if newt is None: taskProgress.info(" * * creating new troop for %s, semester=%s" % (str(oldt.key.id()), oldt.semester_key.get().getname())) newt = Troop.create(oldt.name, oldt.scoutnetID, newsg.key, oldt.semester_key) entities_to_put_first.append(newt) # put first to be able to reference it else: taskProgress.info(" * * already has new troop for %s, semester=%s" % (str(newt.key.id()), newt.semester_key.get().getname())) taskProgress.info(" * Move all trooppersons to the new group") for oldtp in TroopPerson.query(TroopPerson.troop == oldt.key).fetch(): keys_to_delete.append(oldtp.key) newtp = TroopPerson.get_by_id(TroopPerson.getid(newt.key, oldtp.person), use_memcache=True) if newtp is None: logging.info(" * * creating new TroopPerson for %s:%s" % (newt.getname(), oldtp.getname())) newtp = TroopPerson.create_or_update(newt.key, oldtp.person, oldtp.leader) entities_to_put.append(newtp) else: logging.info(" * * already has TroopPerson for %s:%s" % (newt.getname(), oldtp.getname())) taskProgress.info(" * Move all old meetings to the new troop") for oldm in Meeting.query(Meeting.troop==oldt.key).fetch(): keys_to_delete.append(oldm.key) newm = Meeting.get_by_id(Meeting.getId(oldm.datetime, newt.key), use_memcache=True) if newm is None: logging.info(" * * creating new Meeting for %s:%s" % (newt.getname(), oldm.datetime.strftime("%Y-%m-%d %H:%M"))) newm = Meeting(id=Meeting.getId(oldm.datetime, newt.key), datetime=oldm.datetime, name=oldm.name, troop=newt.key, duration=oldm.duration, ishike=oldm.ishike) newm.attendingPersons = oldm.attendingPersons entities_to_put.append(newm) else: logging.info(" * * merging Meeting %s->%s :%s" % (oldm.getname(), newm.getname(), oldm.datetime.strftime("%Y-%m-%d %H:%M"))) need_to_put = False if len(oldm.name) > len(newm.name): # take the longer name. newm.name = oldm.name need_to_put = True for oldattendingpersonkey in oldm.attendingPersons: if oldattendingpersonkey not in newm.attendingPersons: newm.attendingPersons.append(oldattendingpersonkey) need_to_put = True if need_to_put: entities_to_put.append(newm) if delete_sg: keys_to_delete.append(oldsg.key) taskProgress.info("time before put: %s s" % str(time.time() - start_time)) logging.info("Putting %d entities first" % len(entities_to_put_first)) if commit: ndb.put_multi(entities_to_put_first) logging.info("Putting %d entities" % len(entities_to_put)) if commit: ndb.put_multi(entities_to_put) logging.info("Deleting %d keys" % len(keys_to_delete)) if commit: ndb.delete_multi(keys_to_delete) logging.info("clear memcache") if commit: ndb.get_context().clear_cache() taskProgress.info("Done! time: %s s" % str(time.time() - start_time))
def merge_sg(oldname, newname, commit): oldsg = ScoutGroup.getbyname(oldname) if oldsg is None: raise RuntimeError("Old sg name:%s not found" % oldname) newsg = ScoutGroup.getbyname(newname) if newsg is None: raise RuntimeError("New sg name:%s not found" % newname) if not commit: logging.info("*** testmode ***") keys_to_delete = [] entities_to_put_first = [] entities_to_put = [] semester = Semester.getOrCreateCurrent() keys_to_delete.append(oldsg.key) logging.info("Update all users to the new scoutgroup") for u in UserPrefs.query(UserPrefs.groupaccess == oldsg.key).fetch(): u.groupaccess = newsg.key u.activeSemester = semester.key entities_to_put.append(u) logging.info("Moving all persons to the new ScoutGroup:%s", newsg.getname()) for oldp in Person.query(Person.scoutgroup == oldsg.key).fetch(): logging.info(" * Moving %s %s", oldp.getname(), oldp.personnr) oldp.scoutgroup = newsg.key entities_to_put.append(oldp) logging.info("Move all troops to the new ScoutGroup:%s", newsg.getname()) for oldt in Troop.query(Troop.scoutgroup == oldsg.key).fetch(): logging.info(" * found old troop for %s, semester=%s", str(oldt.key.id()), oldt.semester_key.get().getname()) keys_to_delete.append(oldt.key) newt = Troop.get_by_id(Troop.getid(oldt.scoutnetID, newsg.key, oldt.semester_key), use_memcache=True) if newt is None: logging.info(" * * creating new troop for %s, semester=%s", str(oldt.key.id()), oldt.semester_key.get().getname()) newt = Troop.create(oldt.name, oldt.scoutnetID, newsg.key, oldt.semester_key) entities_to_put_first.append(newt) # put first to be able to reference it else: logging.info(" * * already has new troop for %s, semester=%s", str(newt.key.id()), newt.semester_key.get().getname()) logging.info(" * Move all trooppersons to the new group (it they don't already exist there)") for oldtp in TroopPerson.query(TroopPerson.troop == oldt.key).fetch(): keys_to_delete.append(oldtp.key) newtp = TroopPerson.get_by_id(TroopPerson.getid(newt.key, oldtp.person), use_memcache=True) if newtp is None: logging.info(" * * creating new TroopPerson for %s:%s", newt.getname(), oldtp.getname()) newtp = TroopPerson.create(newt.key, oldtp.person, oldtp.leader) entities_to_put.append(newtp) else: logging.info(" * * already has TroopPerson for %s:%s", newt.getname(), oldtp.getname()) logging.info(" * Move all old meetings to the new troop") for oldm in Meeting.query(Meeting.troop==oldt.key).fetch(): keys_to_delete.append(oldm.key) newm = Meeting.get_by_id(Meeting.getId(oldm.datetime, newt.key), use_memcache=True) if newm is None: logging.info(" * * creating new Meeting for %s:%s", newt.getname(), oldm.datetime.strftime("%Y-%m-%d %H:%M")) newm = Meeting.getOrCreate(newt.key, oldm.name, oldm.datetime, oldm.duration, oldm.ishike) newm.attendingPersons = oldm.attendingPersons entities_to_put.append(newm) else: logging.info(" * * already has Meeting for %s:%s", newt.getname(), newt.datetime.strftime("%Y-%m-%d %H:%M")) logging.info("Putting %d entities first", len(entities_to_put_first)) if commit: ndb.put_multi(entities_to_put_first) logging.info("Putting %d entities", len(entities_to_put)) if commit: ndb.put_multi(entities_to_put) logging.info("Deleting %d keys", len(keys_to_delete)) if commit: ndb.delete_multi(keys_to_delete) logging.info("clear memcache") if commit: ndb.get_context().clear_cache() logging.info("Done!")