예제 #1
0
def contact_project_volunteers(request, project_id):
    if not request.user.is_authenticated():
        return HttpResponse(status=401)

    user = get_request_contributor(request)

    body = json.loads(request.body)
    subject = body['subject']
    message = body['message']

    project = Project.objects.get(id=project_id)
    if not user.email_verified or not is_co_owner_or_owner(user, project):
        return HttpResponse(status=403)

    volunteers = VolunteerRelation.get_by_project(project)

    email_subject = '{project}: {subject}'.format(project=project.project_name,
                                                  subject=subject)
    email_template = HtmlEmailTemplate(use_signature=False) \
        .paragraph('\"{message}\" - {firstname} {lastname}'.format(
        message=message,
        firstname=user.first_name,
        lastname=user.last_name)) \
        .paragraph('To reply, email at {email}'.format(email=user.email))
    for volunteer in volunteers:
        # TODO: See if we can send emails in a batch
        # https://docs.djangoproject.com/en/2.2/topics/email/#topics-sending-multiple-emails
        send_to_project_volunteer(volunteer, email_subject, email_template)
    return HttpResponse(status=200)
예제 #2
0
def contact_project_owner(request, project_id):
    if not request.user.is_authenticated():
        return HttpResponse(status=401)

    user = get_request_contributor(request)
    if not user.email_verified:
        return HttpResponse(status=403)

    body = json.loads(request.body)
    message = body['message']

    project = Project.objects.get(id=project_id)
    email_subject = '{firstname} {lastname} would like to connect with {project}'.format(
        firstname=user.first_name,
        lastname=user.last_name,
        project=project.project_name)
    email_template = HtmlEmailTemplate(use_signature=False)\
        .paragraph('\"{message}\" - {firstname} {lastname}'.format(
            message=message,
            firstname=user.first_name,
            lastname=user.last_name))\
        .paragraph('To contact this person, email them at {email}'.format(email=user.email))
    send_to_project_owners(project=project,
                           sender=user,
                           subject=email_subject,
                           template=email_template)
    return HttpResponse(status=200)
예제 #3
0
def contact_project_volunteer(request, application_id):
    if not request.user.is_authenticated():
        return HttpResponse(status=401)

    user = get_request_contributor(request)
    volunteer_relation = VolunteerRelation.objects.get(id=application_id)
    project = volunteer_relation.project

    body = json.loads(request.body)
    subject = body['subject']
    message = body['message']

    # TODO: Condense common code between this and contact_project_volunteers
    if not user.email_verified or not is_co_owner_or_owner(user, project):
        return HttpResponse(status=403)

    email_subject = '{project}: {subject}'.format(project=project.project_name,
                                                  subject=subject)
    email_template = HtmlEmailTemplate(use_signature=False) \
        .paragraph('\"{message}\" - {firstname} {lastname}'.format(
        message=message,
        firstname=user.first_name,
        lastname=user.last_name)) \
        .paragraph('To reply, email at {email}'.format(email=user.email))
    send_to_project_volunteer(volunteer_relation, email_subject,
                              email_template)
    return HttpResponse(status=200)
예제 #4
0
    def create_project(request):

        form = ProjectCreationForm(request.POST)
        # TODO: Form validation
        project = Project.objects.create(
            project_creator=get_request_contributor(request),
            project_name=form.data.get('project_name'),
            project_short_description=form.data.get(
                'project_short_description'),
            project_date_created=timezone.now(),
            project_url='',
            project_description='',
            project_location='',
            is_created=False)
        project = Project.objects.get(id=project.id)

        # Tag fields operate like ManyToMany fields, and so cannot
        # be added until after the object is created.
        Tag.merge_tags_field(project.project_issue_area,
                             form.data.get('project_issue_area'))
        merge_single_file(project, form, FileCategory.THUMBNAIL,
                          'project_thumbnail_location')

        project.save()
        return project
def my_groups(request):
    contributor = get_request_contributor(request)
    response = {}
    if contributor is not None:
        owned_groups = Group.objects.filter(group_creator_id=contributor.id)
        response = {
            'owned_groups': [group.hydrate_to_list_json() for group in owned_groups],
        }
    return JsonResponse(response)
def my_events(request):
    contributor = get_request_contributor(request)
    response = {}
    if contributor is not None:
        owned_events = Event.objects.filter(event_creator_id=contributor.id)
        response = {
            'owned_events': [event.hydrate_to_list_json() for event in owned_events],
        }
    return JsonResponse(response)
def get_project(request, project_id):
    project = Project.objects.get(id=project_id)

    if project is not None:
        if project.is_searchable or is_co_owner_or_staff(get_request_contributor(request), project):
            return JsonResponse(project.hydrate_to_json())
        else:
            return HttpResponseForbidden()
    else:
        return HttpResponse(status=404)
def get_event(request, event_id):
    event = Event.objects.get(id=event_id)

    if event is not None:
        if event.is_searchable or is_creator_or_staff(get_request_contributor(request), event):
            return JsonResponse(event.hydrate_to_json())
        else:
            return HttpResponseForbidden()
    else:
        return HttpResponse(status=404)
def get_group(request, group_id):
    group = Group.objects.get(id=group_id)

    if group is not None:
        if group.is_searchable or is_creator_or_staff(get_request_contributor(request), group):
            return JsonResponse(group.hydrate_to_json())
        else:
            return HttpResponseForbidden()
    else:
        return HttpResponse(status=404)
예제 #10
0
def project_create(request):
    if not request.user.is_authenticated():
        return redirect(section_url(FrontEndSection.LogIn))

    user = get_request_contributor(request)
    if not user.email_verified:
        # TODO: Log this
        return HttpResponse(status=403)

    project = ProjectCreationForm.create_project(request)
    return JsonResponse(project.hydrate_to_json())
예제 #11
0
def my_projects(request):
    contributor = get_request_contributor(request)
    response = {}
    if contributor is not None:
        owned_projects = Project.objects.filter(project_creator_id=contributor.id)
        volunteering_projects = contributor.volunteer_relations.all()
        response = {
            'owned_projects': [project.hydrate_to_list_json() for project in owned_projects],
            'volunteering_projects': volunteering_projects.exists() and list(map(lambda volunteer_relation: volunteer_relation.hydrate_project_volunteer_info(), volunteering_projects))
        }
    return HttpResponse(json.dumps(response))
예제 #12
0
def project_create(request):
    if not request.user.is_authenticated():
        return redirect('/signup')

    user = get_request_contributor(request)
    if not user.email_verified:
        # TODO: Log this
        return HttpResponse(status=403)

    ProjectCreationForm.create_project(request)
    return redirect('/index/?section=MyProjects')
예제 #13
0
    def create_or_edit_project(request, project_id):
        form = ProjectCreationForm(request.POST)
        if project_id is not None:
            project = Project.objects.get(id=project_id)
        else:
            project = Project.objects.create(
                project_creator=get_request_contributor(request),
                project_name=form.data.get('project_name'),
                project_date_created=timezone.now(),
                is_created=False
            )

        if not is_co_owner_or_staff(request.user, project):
            raise PermissionDenied()

        is_created_original = project.is_created
        read_form_field_boolean(project, form, 'is_created')

        read_form_field_string(project, form, 'project_description')
        read_form_field_string(project, form, 'project_description_solution')
        read_form_field_string(project, form, 'project_description_actions')
        read_form_field_string(project, form, 'project_short_description')
        read_form_field_string(project, form, 'project_location')
        read_form_field_string(project, form, 'project_country')
        read_form_field_string(project, form, 'project_state')
        read_form_field_string(project, form, 'project_city')
        read_form_field_string(project, form, 'project_name')
        read_form_field_string(project, form, 'project_url')

        read_form_fields_point(project, form, 'project_location_coords', 'project_latitude', 'project_longitude')

        read_form_field_tags(project, form, 'project_issue_area')
        read_form_field_tags(project, form, 'project_stage')
        read_form_field_tags(project, form, 'project_technologies')
        read_form_field_tags(project, form, 'project_organization')
        read_form_field_tags(project, form, 'project_organization_type')

        if not request.user.is_staff:
            project.project_date_modified = timezone.now()

        project.save()

        merge_json_changes(ProjectLink, project, form, 'project_links')
        merge_json_changes(ProjectFile, project, form, 'project_files')
        merge_json_changes(ProjectPosition, project, form, 'project_positions')

        merge_single_file(project, form, FileCategory.THUMBNAIL, 'project_thumbnail_location')

        if is_created_original != project.is_created:
            print('notifying project creation')
            send_project_creation_notification(project)

        return project
예제 #14
0
    def create_or_edit_group(request, group_id):
        form = GroupCreationForm(request.POST)
        if group_id is not None:
            group = Group.objects.get(id=group_id)
        else:
            group = Group.objects.create(
                group_creator=get_request_contributor(request),
                group_date_created=timezone.now(),
                group_name=form.data.get('group_name'),
                group_short_description=form.data.get(
                    'group_short_description'),
                group_description=form.data.get('group_description'),
                is_created=False)

        if not is_co_owner_or_staff(request.user, group):
            raise PermissionDenied()

        is_created_original = group.is_created
        read_form_field_boolean(group, form, 'is_created')

        project_fields_changed = False
        read_form_field_string(group, form, 'group_description')
        read_form_field_string(group, form, 'group_short_description')
        read_form_field_string(group, form, 'group_country')
        read_form_field_string(group, form, 'group_location')
        read_form_field_string(group, form, 'group_state')
        read_form_field_string(group, form, 'group_city')
        project_fields_changed |= read_form_field_string(
            group, form, 'group_name')
        read_form_field_string(group, form, 'group_url')

        read_form_fields_point(group, form, 'group_location_coords',
                               'group_latitude', 'group_longitude')

        if not request.user.is_staff:
            group.group_date_modified = timezone.now()

        group.save()

        merge_json_changes(ProjectLink, group, form, 'group_links')
        merge_json_changes(ProjectFile, group, form, 'group_files')

        project_fields_changed |= merge_single_file(
            group, form, FileCategory.THUMBNAIL, 'group_thumbnail_location')

        if project_fields_changed:
            group.update_linked_items()

        if is_created_original != group.is_created:
            send_group_creation_notification(group)

        return group
예제 #15
0
def event_delete_project(request, event_id):
    body = json.loads(request.body)
    event = Event.objects.get(id=event_id)
    project = Project.objects.get(id=body["project_id"])

    if event is not None and project is not None:
        if is_creator_or_staff(get_request_contributor(request), event):
            relationship = ProjectRelationship.objects.get(relationship_project=project.id, relationship_event=event.id)

            if relationship is not None:
                relationship.delete()
                return HttpResponse(status=204)

    return HttpResponse(status=404)
예제 #16
0
def group_delete_project(request, group_id):
    body = json.loads(request.body)
    group = Group.objects.get(id=group_id)
    project = Project.objects.get(id=body["project_id"])

    if group is not None and project is not None:
        if is_creator_or_staff(get_request_contributor(request), group):
            relationship = ProjectRelationship.objects.get(relationship_project=project.id, relationship_group=group.id)

            if relationship is not None:
                relationship.delete()
                return HttpResponse(status=204)

    return HttpResponse(status=404)
예제 #17
0
def about_event_preload(context, request):
    context = default_preload(context, request)
    query_args = url_params(request)
    event_id = query_args['id'][0]
    event = Event.get_by_id_or_slug(event_id, get_request_contributor(request))
    event_json = event.hydrate_to_json()
    if event_json is not None:
        context['title'] = event_json['event_name'] + ' | DemocracyLab'
        context['description'] = event_json['event_short_description']
        if 'event_thumbnail' in event_json:
            context['og_image'] = event_json['event_thumbnail']['publicUrl']
    else:
        print('Failed to preload event info, no cache entry found: ' + event_id)
    return context
예제 #18
0
def approve_project(request, project_id):
    project = Project.objects.get(id=project_id)
    user = get_request_contributor(request)

    if project is not None:
        if user.is_staff:
            project.is_searchable = True
            project.save()
            notify_project_owners_project_approved(project)
            messages.success(request, 'Project Approved')
            return redirect('/index/?section=AboutProject&id=' + str(project.id))
        else:
            return HttpResponseForbidden()
    else:
        return HttpResponse(status=404)
예제 #19
0
def event_create(request):
    if not request.user.is_authenticated():
        return redirect(section_url(FrontEndSection.LogIn))

    user = get_request_contributor(request)
    if not user.email_verified:
        # TODO: Log this
        return HttpResponse(status=403)

    event = None
    try:
        event = EventCreationForm.create_event(request)
    except PermissionDenied:
        return HttpResponseForbidden()
    return JsonResponse(event.hydrate_to_json())
예제 #20
0
def event_add_project(request, event_id):
    body = json.loads(request.body)
    event = Event.objects.get(id=event_id)

    if event is not None and body["project_ids"] is not None:
        if not is_creator_or_staff(get_request_contributor(request), event):
            return HttpResponseForbidden()

        projects = Project.objects.filter(id__in=body["project_ids"])

        for project in projects:
            ProjectRelationship.create(event, project)

        return HttpResponse(status=204)
    else:
        return HttpResponse(status=404)
예제 #21
0
def conclude_volunteering_with_project(request, application_id):
    if not request.user.is_authenticated():
        return HttpResponse(status=401)

    user = get_request_contributor(request)
    volunteer_relation = VolunteerRelation.objects.get(id=application_id)

    if not user.id == volunteer_relation.volunteer.id:
        return HttpResponse(status=403)

    send_volunteer_conclude_email(user, volunteer_relation.project.project_name)

    body = json.loads(request.body)
    volunteer_relation.delete()

    notify_project_owners_volunteer_concluded_email(volunteer_relation, body['message'])
    return HttpResponse(status=200)
예제 #22
0
def contact_project_owner(request, project_id):
    if not request.user.is_authenticated():
        return HttpResponse(status=401)

    user = get_request_contributor(request)
    if not user.email_verified:
        return HttpResponse(status=403)

    body = json.loads(request.body)
    message = body['message']

    project = Project.objects.get(id=project_id)
    email_subject = '{firstname} {lastname} would like to connect with {project}'.format(
                    firstname=user.first_name,
                    lastname=user.last_name,
                    project=project.project_name)
    email_body = '{message} \n -- \n To contact this person, email {user}'.format(message=message, user=user.email)
    send_to_project_owners(project=project, sender=user, subject=email_subject, body=email_body)
    return HttpResponse(status=200)
예제 #23
0
def renew_volunteering_with_project(request, application_id):
    if not request.user.is_authenticated():
        return HttpResponse(status=401)

    user = get_request_contributor(request)
    volunteer_relation = VolunteerRelation.objects.get(id=application_id)

    if not user.id == volunteer_relation.volunteer.id:
        return HttpResponse(status=403)

    body = json.loads(request.body)
    volunteer_relation.projected_end_date = body['projectedEndDate']
    volunteer_relation.re_enrolled_last_date = timezone.now()
    volunteer_relation.re_enroll_reminder_count = 0
    volunteer_relation.re_enroll_last_reminder_date = None
    volunteer_relation.save()

    notify_project_owners_volunteer_renewed_email(volunteer_relation, body['message'])
    return HttpResponse(status=200)
예제 #24
0
    def create_project(request):
        form = ProjectCreationForm(request.POST)
        # TODO: Form validation
        project = Project.objects.create(
            project_creator=get_request_contributor(request),
            project_description=form.data.get('project_description'),
            project_location=form.data.get('project_location'),
            project_name=form.data.get('project_name'),
            project_url=form.data.get('project_url'),
        )
        project = Project.objects.get(id=project.id)

        issue_areas = form.data.get('project_issue_area')
        if issue_areas and len(issue_areas) != 0:
            # Tag fields operate like ManyToMany fields, and so cannot
            # be added until after the object is created.
            project.project_issue_area.add(issue_areas)

        project.save()

        links_json_text = form.data.get('project_links')
        if len(links_json_text) > 0:
            links_json = json.loads(links_json_text)
            for link_json in links_json:
                link = ProjectLink.from_json(project, link_json)
                link.save()

        files_json_text = form.data.get('project_files')
        if len(files_json_text) > 0:
            files_json = json.loads(files_json_text)
            for file_json in files_json:
                file = ProjectFile.from_json(project, FileCategory.ETC,
                                             file_json)
                file.save()

        project_thumbnail_location = form.data.get(
            'project_thumbnail_location')
        if len(project_thumbnail_location) > 0:
            thumbnail_json = json.loads(project_thumbnail_location)
            thumbnail = ProjectFile.from_json(project, FileCategory.THUMBNAIL,
                                              thumbnail_json)
            thumbnail.save()
예제 #25
0
def volunteer_with_project(request, project_id):
    if not request.user.is_authenticated():
        return HttpResponse(status=401)

    user = get_request_contributor(request)
    if not user.email_verified:
        return HttpResponse(status=403)

    project = Project.objects.get(id=project_id)
    body = json.loads(request.body)
    projected_end_date = body['projectedEndDate']
    message = body['message']
    role = body['roleTag']
    volunteer_relation = VolunteerRelation.create(
        project=project,
        volunteer=user,
        projected_end_date=projected_end_date,
        role=role,
        application_text=message)
    send_volunteer_application_email(volunteer_relation)
    return HttpResponse(status=200)
예제 #26
0
    def create_event(request):

        form = EventCreationForm(request.POST)
        # TODO: Form validation
        event = Event.objects.create(
            event_creator=get_request_contributor(request),
            event_date_created=timezone.now(),
            event_name=form.data.get('event_name'),
            event_location=form.data.get('event_location'),
            event_rsvp_url=form.data.get('event_rsvp_url'),
            event_date_start=parse(form.data.get('event_date_start'), fuzzy=True),
            event_date_end=parse(form.data.get('event_date_end'), fuzzy=True),
            event_short_description=form.data.get('event_short_description'),
            is_created=True,
            is_searchable=True
        )
        event = Event.objects.get(id=event.id)

        merge_single_file(event, form, FileCategory.THUMBNAIL, 'event_thumbnail_location')

        event.save()
        return event
예제 #27
0
    def create_group(request):

        if not request.user.is_staff:
            raise PermissionDenied()

        form = GroupCreationForm(request.POST)
        # TODO: Form validation
        group = Group.objects.create(
            group_creator=get_request_contributor(request),
            group_date_created=timezone.now(),
            group_name=form.data.get('group_name'),
            group_short_description=form.data.get('group_short_description'),
            group_description=form.data.get('group_description'),
            group_location=form.data.get('group_location'),
            is_created=False
        )
        group = Group.objects.get(id=group.id)

        # TODO: confirm    
        merge_single_file(group, form, FileCategory.THUMBNAIL, 'group_thumbnail_location')

        group.save()
        return group
예제 #28
0
    def create_or_edit_event(request, event_id):
        form = EventCreationForm(request.POST)
        if event_id is not None:
            event = Event.objects.get(id=event_id)
        else:
            event = Event.objects.create(
                event_creator=get_request_contributor(request),
                event_date_created=timezone.now(),
                event_name=form.data.get('event_name'),
                event_date_start=parse_front_end_datetime(
                    form.data.get('event_date_start')),
                event_date_end=parse_front_end_datetime(
                    form.data.get('event_date_end')),
                is_created=False,
                is_searchable=False)

        if not is_co_owner_or_staff(request.user, event):
            raise PermissionDenied()

        is_created_original = event.is_created
        fields_changed = False
        project_fields_changed = False
        fields_changed |= read_form_field_string(event, form, 'event_agenda')
        fields_changed |= read_form_field_string(event, form,
                                                 'event_description')
        fields_changed |= read_form_field_string(event, form,
                                                 'event_short_description')
        project_fields_changed |= read_form_field_string(
            event, form, 'event_name')
        project_fields_changed |= read_form_field_string(
            event, form, 'event_location')
        fields_changed |= read_form_field_string(event, form, 'event_rsvp_url')
        fields_changed |= read_form_field_string(event, form, 'event_live_id')
        project_fields_changed |= read_form_field_string(
            event, form, 'event_organizers_text')

        project_fields_changed |= read_form_field_datetime(
            event, form, 'event_date_start')
        project_fields_changed |= read_form_field_datetime(
            event, form, 'event_date_end')

        fields_changed |= read_form_field_boolean(event, form, 'is_searchable')
        fields_changed |= read_form_field_boolean(event, form, 'is_created')
        project_fields_changed |= read_form_field_boolean(
            event, form, 'is_private')

        slug = form.data.get('event_slug')
        if slug is not None:
            slug = slug.lower()
            slug_event = Event.get_by_id_or_slug(slug)
            if slug_event and slug_event.id != event.id:
                print(
                    'Could not change event {event} slug to {slug} because another event already has that slug: {existing_event}'
                    .format(event=event.__str__(),
                            slug=slug,
                            existing_event=slug_event.__str__()))
            else:
                slug_changed = read_form_field_string(event, form,
                                                      'event_slug',
                                                      lambda str: str.lower())
                if slug_changed:
                    project_fields_changed = True
                    name_record = NameRecord.objects.create(event=event,
                                                            name=slug)
                    name_record.save()

        pre_change_projects = event.get_linked_projects()
        pre_change_projects = pre_change_projects and list(
            pre_change_projects.all())
        org_changed = read_form_field_tags(event, form,
                                           'event_legacy_organization')
        project_fields_changed |= org_changed

        event.event_date_modified = timezone.now()

        project_fields_changed |= merge_single_file(
            event, form, FileCategory.THUMBNAIL, 'event_thumbnail_location')

        event.save()

        if is_created_original != event.is_created:
            send_event_creation_notification(event)

        if fields_changed or project_fields_changed:
            event.recache()
        if project_fields_changed:
            change_projects = []
            if pre_change_projects:
                change_projects += pre_change_projects
            post_change_projects = event.get_linked_projects()
            if post_change_projects:
                change_projects += post_change_projects.all()
            change_projects = list(set(change_projects))
            if change_projects:
                for project in change_projects:
                    project.recache(recache_linked=False)

        return event
예제 #29
0
    def create_project(request):
        form = ProjectCreationForm(request.POST)
        # TODO: Form validation
        project = Project.objects.create(
            project_creator=get_request_contributor(request),
            project_description=form.data.get('project_description'),
            project_short_description=form.data.get(
                'project_short_description'),
            project_location=form.data.get('project_location'),
            project_name=form.data.get('project_name'),
            project_url=form.data.get('project_url'),
            project_date_created=timezone.now())
        project = Project.objects.get(id=project.id)

        # Tag fields operate like ManyToMany fields, and so cannot
        # be added until after the object is created.
        issue_areas = form.data.get('project_issue_area')
        if issue_areas and len(issue_areas) != 0:
            project.project_issue_area.add(issue_areas)

        project_stage = form.data.get('project_stage')
        if project_stage and len(project_stage) != 0:
            project.project_stage.add(project_stage)

        project_technologies = form.data.get('project_technologies')
        if len(project_technologies) > 0:
            for tech in project_technologies.split(','):
                project.project_technologies.add(tech)

        project_organization = form.data.get('project_organization')
        if len(project_organization) > 0:
            for org in project_organization.split(','):
                project.project_organization.add(org)

        project.save()

        positions_json_text = form.data.get('project_positions')
        if len(positions_json_text) > 0:
            positions_json = json.loads(positions_json_text)
            for position_json in positions_json:
                position = ProjectPosition.create_from_json(
                    project, position_json)

        links_json_text = form.data.get('project_links')
        if len(links_json_text) > 0:
            links_json = json.loads(links_json_text)
            for link_json in links_json:
                link = ProjectLink.from_json(project, link_json)
                link.save()

        files_json_text = form.data.get('project_files')
        if len(files_json_text) > 0:
            files_json = json.loads(files_json_text)
            for file_json in files_json:
                file = ProjectFile.from_json(project, FileCategory.ETC,
                                             file_json)
                file.save()

        project_thumbnail_location = form.data.get(
            'project_thumbnail_location')
        if len(project_thumbnail_location) > 0:
            thumbnail_json = json.loads(project_thumbnail_location)
            thumbnail = ProjectFile.from_json(project, FileCategory.THUMBNAIL,
                                              thumbnail_json)
            thumbnail.save()

        # Notify the admins that a new project has been created
        send_project_creation_notification(project)