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)
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)
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)
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)
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())
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))
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')
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
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
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)
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)
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
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)
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())
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)
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)
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)
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)
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()
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)
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
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
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
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)