예제 #1
0
def edit_section(request, id):
    db = Firestore.get_instance()
    section_ref = db.collection('sections').document(id)
    section = section_ref.get()
    sec = section.to_dict()

    classNames = []
    for i in sec.get("classes"):
        classNames.append(i.get("className"))

    classes_string = ",".join(classNames)

    s = Section(firebase_id=id,
                sectionName=sec.get('sectionName'),
                sectionFullName=sec.get('sectionFullName'),
                classes=classes_string)

    sec_form = SectionForm(request.POST, instance=s)
    if request.method == 'POST':
        if sec_form.is_valid():
            sec_form.save()
            return redirect('/sections')

    else:
        sec_form = SectionForm(instance=s)
    return render(request, 'create_section.html', {
        'form': sec_form,
        'edit_section': True
    })
예제 #2
0
def sections(request):
    db = Firestore.get_instance()
    section_ref = db.collection('sections')
    section_docs = section_ref.stream()
    sections = []

    for doc in section_docs:
        doc_fields = doc.to_dict()
        classNames = []

        classes = doc_fields.get('classes', [])
        for this_class in classes:
            classNames.append(this_class.get("className"))

        classes_string = ",".join(classNames)

        section = Section(firebase_id=doc.id,
                          sectionName=doc_fields.get('sectionName'),
                          sectionFullName=doc_fields.get('sectionFullName'),
                          classes=classes_string)
        sections.append(section)

    sections.sort(key=lambda item: item.sectionName)

    return render(request, "sections.html", {"sections": sections})
예제 #3
0
 def save(self):
     data = self.cleaned_data
     db = Firestore.get_instance()
     id = data.get('firebase_id')
     if id:
         doc_ref = db.collection(u'event').document(id)
     else:
         doc_ref = db.collection(u'event').document()
     doc_ref.set({
         u'name': data.get('name'),
         u'disappear': data.get('disappear'),
         u'form': data.get('form'),
         u'release': data.get('release'),
         u'who': data.get('who')
     })
     return data
예제 #4
0
    def get_all_classes():
        db = Firestore.get_instance()
        section_ref = db.collection('sections')
        docs = section_ref.get()
        classes = []

        for section in docs:
            section_fields = section.to_dict()
            section_classes = section_fields.get('classes')
            if section_classes is not None:
                for section_class in section_classes:
                    class_name = section_class.get('className')
                    classes.append(class_name)

        classes.sort(key=str.casefold)

        return classes
예제 #5
0
def ticket_system(request):
    db = Firestore.get_instance()
    events_ref = db.collection(u'event')
    docs = events_ref.stream()
    events = []

    for doc in docs:
        doc_fields = doc.to_dict()
        event = Event(firebase_id=doc.id,
                      name=doc_fields.get('name'),
                      disappear=doc_fields.get('disappear'),
                      form=doc_fields.get('form'),
                      release=doc_fields.get('release'),
                      who=doc_fields.get('who'))
        events.append(event)

    events.sort(key=lambda item: item.name)

    return render(request, "ticket-system.html", {"events": events})
예제 #6
0
    def save(self):
        data = self.cleaned_data
        db = Firestore.get_instance()
        id = data.get('firebase_id')
        class_list = []
        classes_split = data.get('classes').split(',')
        for class_name in classes_split:
            class_list.append({'className': class_name})

        if id:
            doc_ref = db.collection(u'sections').document(id)
        else:
            doc_ref = db.collection(u'sections').document()

        doc_ref.set({
            u'sectionName': data.get('sectionName'),
            u'sectionFullName': data.get('sectionFullName'),
            u'classes': class_list
        })
        return data
예제 #7
0
def edit_event(request, id):
    db = Firestore.get_instance()
    event_ref = db.collection(u'event').document(id)
    event = event_ref.get()
    doc_fields = event.to_dict()
    event_object = Event(firebase_id=id,
                         name=doc_fields.get('name'),
                         disappear=doc_fields.get('disappear'),
                         form=doc_fields.get('form'),
                         release=doc_fields.get('release'),
                         who=doc_fields.get('who'))
    form = EventForm(request.POST, instance=event_object)
    if request.method == 'POST':
        if form.is_valid():
            form.save()
            return redirect('ticket-system/')
    else:
        form = EventForm(instance=event_object)
    return render(request, 'create_event.html', {
        'form': form,
        'edit_event': True
    })
예제 #8
0
def delete_event(request, id):
    db = Firestore.get_instance()
    event_ref = db.collection(u'event').document(id)
    event_ref.delete()
    return redirect('/ticket-system/')
예제 #9
0
def delete_section(request, id):
    db = Firestore.get_instance()
    section_ref = db.collection('sections').document(id)
    section_ref.delete()
    return redirect('/sections')
예제 #10
0
def send_automatic_notification():
    """
    Finds all events that occur tomorrow if the current time is between
    12:00-13:00 or within 20-40 minutes if the time is 7:30 and sends a
    notification to all users that can attend the event.
    """
    current_time = datetime.now()
    current_date = datetime.today()
    current_hour = current_time.hour

    events = None
    start_limit = current_time
    end_limit = current_time

    if current_hour == 12:
        tomorrow_date = current_date + timedelta(days=1)

        start_limit = datetime.combine(tomorrow_date, time.min)
        end_limit = datetime.combine(tomorrow_date, time.max)

    elif current_hour == 7:
        eight_am = datetime.combine(current_date, time(hour=8))

        # Add a margin of 10 minutes around 8 just for safety
        start_limit = eight_am - timedelta(minutes=10)
        end_limit = eight_am + timedelta(minutes=10)

    else:
        return

    start_limit = localize_timestamp(start_limit)
    end_limit = localize_timestamp(end_limit)

    db = Firestore.get_instance()
    events = db.collection('event')\
        .where('release', '>=', start_limit)\
        .where('release', '<=', end_limit)\
        .stream()

    for event in events:
        event_dict = event.to_dict()
        attending_classes = event_dict.get("who")

        registration_tokens = Firestore\
            .get_user_registration_tokens_by_classes(attending_classes)

        content = ""
        title = ""
        sender = "Rekå"

        if current_hour == 12:
            release = event_dict.get("release")
            release_stockholm_time = release.astimezone(
                timezone("Europe/Stockholm"))
            release_time = release_stockholm_time.strftime("%-H:%M")

            content = ("Imorgon klockan {0} släpps biljetterna till {1}. "
                       "Glöm inte att reservera "
                       "din biljett här i appen!").format(
                           release_time, event_dict.get("name"))

            title = ("Biljettsläpp för {0} öppnar imorgon").format(
                event_dict.get("name"))

        elif current_hour == 7:
            content = (
                "Om 30 minuter släpps biljetterna till {0}. "
                "Glöm inte att reservera din biljett här i appen!").format(
                    event_dict.get("name"))

            title = ("Biljettsläpp för {0} öppnar om 30 min").format(
                event_dict.get("name"))

        else:
            raise ValueError(("Could not set a title and content "
                              "for automatic reminder notification"))

        statistics = CloudMessaging.send_notification(registration_tokens,
                                                      title, content, sender)

        print(statistics)