def test_generate_meeting_specs(database): # delete current specs keys = [key for key in MeetingSpec.query().iter(keys_only=True)] ndb.delete_multi(keys) meeting_specs = MeetingSpec.query().fetch() assert len(meeting_specs) == 0 # ensure we create new specs generate_meeting_specs() meeting_specs = MeetingSpec.query().fetch() assert len(meeting_specs) == 2
def get_previous_meetings(cooldown=MEETING_COOLDOWN_WEEKS): meetings = defaultdict(list) # get all meeting specs from x weeks ago til now time_threshold_for_meetings = datetime.now() - timedelta(weeks=cooldown) meeting_spec_keys = [ spec.key for spec in MeetingSpec.query( MeetingSpec.datetime > time_threshold_for_meetings).fetch() ] logging.info('Previous Meeting History: ') logging.info([ meeting.get().datetime.strftime("%Y-%m-%d %H:%M") for meeting in meeting_spec_keys ]) if meeting_spec_keys == []: return set([]) # get all meetings from meeting specs meeting_keys = [ meeting.key for meeting in Meeting.query().filter( Meeting.meeting_spec.IN(meeting_spec_keys)).fetch() ] if meeting_keys == []: return set([]) # get all participants from meetings participants = MeetingParticipant.query().filter( MeetingParticipant.meeting.IN(meeting_keys)).fetch() if participants == []: return set([]) # group by meeting Id for participant in participants: meetings[participant.meeting.id()].append(participant.user) # ids are sorted, all matches should be in increasing order by id for the matching algorithm to work disallowed_meetings = set([ tuple(sorted(meeting, key=lambda Key: Key.id())) for meeting in meetings.values() ]) logging.info('Past Meetings') logging.info([ tuple([meeting.get().get_username() for meeting in meeting]) for meeting in disallowed_meetings ]) disallowed_meetings = { tuple([meeting.id() for meeting in meeting]) for meeting in disallowed_meetings } return disallowed_meetings
def store_specs_from_subscription(subscription_key, week_start, specs): """ Idempotent function to store meeting specs for this week. """ try: current_specs = MeetingSpec.query( MeetingSpec.meeting_subscription == subscription_key, MeetingSpec.datetime > week_start).fetch() except NeedIndexError: current_specs = [] if current_specs: return ndb.put_multi(specs) return specs
def get_specs_for_current_week(): week_start = datetime.now() - timedelta(days=datetime.now().weekday()) week_start.replace(hour=0, minute=0, second=0, microsecond=0) return MeetingSpec.query(MeetingSpec.datetime > week_start).fetch()
def test_store_specs_from_subscription(database): week_start, specs = get_specs_from_subscription(database.sub) store_specs_from_subscription(database.sub.key, week_start, specs) assert len(MeetingSpec.query().fetch()) == 2
def test_generate_meeting_specs_idempotent(database): # ensure we don't create more specs generate_meeting_specs() meeting_specs = MeetingSpec.query().fetch() assert len(meeting_specs) == 2