GetTogether/get_together/views/orgs.py

501 lines
20 KiB
Python

from django.utils.translation import ugettext_lazy as _
from django.contrib import messages
from django.contrib.auth import logout as logout_user
from django.contrib.auth.decorators import login_required
from django.contrib.sites.models import Site
from django.shortcuts import render, redirect, reverse, get_object_or_404
from django.http import HttpResponse, JsonResponse
from django.core.mail import send_mail
from django.template.loader import get_template, render_to_string
from django.conf import settings
from events.models.profiles import Organization, Team, UserProfile, Member, OrgTeamRequest
from events.models.events import Event, CommonEvent, Place, Attendee
from events.forms import OrganizationForm, CommonEventForm, RequestToJoinOrgForm, InviteToJoinOrgForm, AcceptRequestToJoinOrgForm, AcceptInviteToJoinOrgForm, OrgContactForm
from events import location
from events.utils import slugify
from accounts.models import EmailRecord
import datetime
import simplejson
# Create your views here.
def show_org(request, org_slug):
org = get_object_or_404(Organization, slug=org_slug)
upcoming_events = CommonEvent.objects.filter(organization=org, end_time__gt=datetime.datetime.now()).order_by('start_time')
recent_events = CommonEvent.objects.filter(organization=org, end_time__lte=datetime.datetime.now()).order_by('-start_time')[:5]
total_members = UserProfile.objects.filter(member__team__organization=org).distinct().count()
total_events= Event.objects.filter(team__organization=org).distinct().count()
context = {
'org': org,
'upcoming_events': upcoming_events,
'recent_events': recent_events,
'member_list': Team.objects.filter(organization=org).order_by('name'),
'can_create_event': request.user.profile.can_create_common_event(org),
'can_edit_org': request.user.profile.can_edit_org(org),
'member_count': total_members,
'event_count': total_events,
}
return render(request, 'get_together/orgs/show_org.html', context)
@login_required
def edit_org(request, org_slug):
org = get_object_or_404(Organization, slug=org_slug)
if not request.user.profile.can_edit_org(org):
messages.add_message(request, messages.WARNING, message=_('You can not make changes to this organization.'))
return redirect('show-org', org_slug=org.slug)
if request.method == 'GET':
form = OrganizationForm(instance=org)
context = {
'org': org,
'org_form': form,
}
return render(request, 'get_together/orgs/edit_org.html', context)
elif request.method == 'POST':
form = OrganizationForm(request.POST, request.FILES, instance=org)
if form.is_valid():
form.save()
return redirect('show-org', org_slug=org.slug)
else:
context = {
'org': org,
'org_form': form,
}
return render(request, 'get_together/orgs/edit_org.html', context)
else:
return redirect('home')
@login_required
def request_to_join_org(request, org_slug):
org = get_object_or_404(Organization, slug=org_slug)
if not len(request.user.profile.administering) > 0:
messages.add_message(request, messages.WARNING, message=_('You are not the administrator for any teams.'))
return redirect('show-org', org_slug=org.slug)
req = OrgTeamRequest(organization=org, request_origin=OrgTeamRequest.TEAM, requested_by=request.user.profile)
if request.method == 'GET':
form = RequestToJoinOrgForm(instance=req)
form.fields['team'].queryset = Team.objects.filter(member__user=request.user.profile, member__role=Member.ADMIN).order_by('name')
context = {
'org': org,
'request_form': form,
}
return render(request, 'get_together/orgs/request_to_join.html', context)
elif request.method == 'POST':
form = RequestToJoinOrgForm(request.POST, instance=req)
form.fields['team'].queryset = Team.objects.filter(member__user=request.user.profile, member__role=Member.ADMIN).order_by('name')
if form.is_valid():
req = form.save()
send_org_request(req)
messages.add_message(request, messages.SUCCESS, message=_('Your request has been send to the organization administrators.'))
return redirect('show-org', org_slug=org.slug)
else:
context = {
'org': org,
'request_form': form,
}
return render(request, 'get_together/orgs/request_to_join.html', context)
else:
return redirect('home')
def send_org_request(req):
context = {
'sender': req.requested_by,
'req': req,
'org': req.organization,
'team': req.team,
'site': Site.objects.get(id=1),
}
email_subject = 'Request to join: %s' % req.team.name
email_body_text = render_to_string('get_together/emails/orgs/request_to_org.txt', context)
email_body_html = render_to_string('get_together/emails/orgs/request_to_org.html', context)
email_from = getattr(settings, 'DEFAULT_FROM_EMAIL', 'noreply@gettogether.community')
admin = req.organization.owner_profile
success = send_mail(
from_email=email_from,
html_message=email_body_html,
message=email_body_text,
recipient_list=[admin.user.email],
subject=email_subject,
fail_silently=True,
)
EmailRecord.objects.create(
sender=req.requested_by.user,
recipient=admin.user,
email=admin.user.email,
subject=email_subject,
body=email_body_text,
ok=success
)
@login_required
def invite_to_join_org(request, team_id):
team = get_object_or_404(Team, id=team_id)
if not request.user.profile.owned_orgs.count() > 0:
messages.add_message(request, messages.WARNING, message=_('You are not the administrator for any organizations.'))
return redirect('show-team', team_id=team_id)
invite = OrgTeamRequest(team=team, request_origin=OrgTeamRequest.ORG, requested_by=request.user.profile)
if request.method == 'GET':
form = InviteToJoinOrgForm(instance=invite)
form.fields['organization'].queryset = Organization.objects.filter(owner_profile=request.user.profile).order_by('name')
context = {
'team': team,
'invite_form': form,
}
return render(request, 'get_together/orgs/invite_to_join.html', context)
elif request.method == 'POST':
form = InviteToJoinOrgForm(request.POST, instance=invite)
if form.is_valid():
invite = form.save()
send_org_invite(invite)
messages.add_message(request, messages.SUCCESS, message=_('Your request has been send to the team administrators.'))
return redirect('show-team', team_id=team_id)
else:
context = {
'team': team,
'invite_form': form,
}
return render(request, 'get_together/orgs/invite_to_join.html', context)
else:
return redirect('home')
def send_org_invite(req):
context = {
'sender': req.requested_by,
'req': req,
'org': req.organization,
'team': req.team,
'site': Site.objects.get(id=1),
}
email_subject = 'Invitation to join: %s' % req.organization.name
email_body_text = render_to_string('get_together/emails/orgs/invite_to_org.txt', context)
email_body_html = render_to_string('get_together/emails/orgs/invite_to_org.html', context)
email_from = getattr(settings, 'DEFAULT_FROM_EMAIL', 'noreply@gettogether.community')
for admin in Member.objects.filter(team=req.team, role=Member.ADMIN, user__user__account__is_email_confirmed=True):
success = send_mail(
from_email=email_from,
html_message=email_body_html,
message=email_body_text,
recipient_list=[admin.user.user.email],
subject=email_subject,
fail_silently=True,
)
EmailRecord.objects.create(
sender=req.requested_by.user,
recipient=admin.user.user,
email=admin.user.user.email,
subject=email_subject,
body=email_body_text,
ok=success
)
@login_required
def confirm_request_to_join_org(request, request_key):
req = get_object_or_404(OrgTeamRequest, request_key=request_key)
if req.request_origin == req.ORG:
return accept_invite_to_join_org(request, req)
else:
return accept_request_to_join_org(request, req)
@login_required
def accept_request_to_join_org(request, req):
if not request.user.profile.can_edit_org(req.organization):
messages.add_message(request, messages.WARNING, message=_('You do not have permission to accept new teams to this organization.'))
return redirect('show-org', org_slug=req.organization.slug)
if request.method == 'GET':
form = AcceptRequestToJoinOrgForm()
context = {
'invite': req,
'org': req.organization,
'team': req.team,
'request_form': form,
}
return render(request, 'get_together/orgs/accept_request.html', context)
elif request.method == 'POST':
form = AcceptRequestToJoinOrgForm(request.POST)
if form.is_valid() and form.cleaned_data['confirm']:
req.accepted_by = request.user.profile
req.joined_date = datetime.datetime.now()
req.save()
req.team.organization = req.organization
req.team.save()
messages.add_message(request, messages.SUCCESS, message=_('%s has been added to your organization.' % req.team.name))
return redirect('show-org', org_slug=req.organization.slug)
else:
context = {
'invite': req,
'org': req.organization,
'team': req.team,
'request_form': form,
}
return render(request, 'get_together/orgs/accept_request.html', context)
else:
return redirect('home')
@login_required
def accept_invite_to_join_org(request, req):
if not request.user.profile.can_edit_team(req.team):
messages.add_message(request, messages.WARNING, message=_('You do not have permission to add this team to an orgnization.'))
return redirect('show-team-by-slug', team_slug=req.team.slug)
if request.method == 'GET':
form = AcceptInviteToJoinOrgForm()
context = {
'invite': req,
'org': req.organization,
'team': req.team,
'invite_form': form,
}
return render(request, 'get_together/orgs/accept_invite.html', context)
elif request.method == 'POST':
form = AcceptInviteToJoinOrgForm(request.POST)
if form.is_valid() and form.cleaned_data['confirm']:
req.accepted_by = request.user.profile
req.joined_date = datetime.datetime.now()
req.save()
req.team.organization = req.organization
req.team.save()
messages.add_message(request, messages.SUCCESS, message=_('You team has been added to %s.' % req.organization.name))
return redirect('show-team-by-slug', team_slug=req.team.slug)
else:
context = {
'invite': req,
'org': req.organization,
'team': req.team,
'invite_form': form,
}
return render(request, 'get_together/orgs/accept_invite.html', context)
else:
return redirect('home')
@login_required
def manage_org_teams(request, org_slug):
org = get_object_or_404(Organization, slug=org_slug)
if not request.user.profile.can_edit_org(org):
messages.add_message(request, messages.WARNING, message=_('You can not manage this organization\'s members.'))
return redirect('show-org', org.slug)
teams = Team.objects.filter(organization=org)
team_choices = [(team.id, team.name) for team in teams]
default_choices = [('all', 'All Teams (%s)' % len(team_choices))]
if request.method == 'POST':
contact_form = OrgContactForm(request.POST)
contact_form.fields['to'].choices = default_choices + team_choices
if contact_form.is_valid():
to = contact_form.cleaned_data['to']
body = contact_form.cleaned_data['body']
if to == 'all':
count = 0
for team in teams:
contact_team(team, org, body, request.user.profile)
count += 1
messages.add_message(request, messages.SUCCESS, message=_('Emailed %s teams' % count))
else:
try:
team = Team.objects.get(id=to)
contact_team(team, org, body, request.user.profile)
messages.add_message(request, messages.SUCCESS, message=_('Emailed %s' % team.name))
except Team.DoesNotExist:
messages.add_message(request, messages.ERROR, message=_('Error sending message: Unknown team (%s)'%to))
pass
return redirect('manage-teams', org.slug)
else:
messages.add_message(request, messages.ERROR, message=_('Error sending message: %s' % contact_form.errors))
else:
contact_form = OrgContactForm()
contact_form.fields['to'].choices = default_choices + team_choices
pending = OrgTeamRequest.objects.filter(organization=org, joined_date__isnull=True).exclude(team__in=teams)
context = {
'org': org,
'teams': teams,
'requests': pending.filter(request_origin=OrgTeamRequest.TEAM),
'invites': pending.filter(request_origin=OrgTeamRequest.ORG),
'contact_form': contact_form,
'can_edit_org': request.user.profile.can_edit_org(org),
}
return render(request, 'get_together/orgs/manage_teams.html', context)
def contact_team(team, org, body, sender):
context = {
'sender': sender,
'team': team,
'org': org,
'body': body,
'site': Site.objects.get(id=1),
}
email_subject = 'A message from: %s' % org.name
email_body_text = render_to_string('get_together/emails/orgs/team_contact.txt', context)
email_body_html = render_to_string('get_together/emails/orgs/team_contact.html', context)
email_from = getattr(settings, 'DEFAULT_FROM_EMAIL', 'noreply@gettogether.community')
for member in Member.objects.filter(team=team, role=Member.ADMIN):
email_recipients = [member.user.user.email]
success = send_mail(
from_email=email_from,
html_message=email_body_html,
message=email_body_text,
recipient_list=email_recipients,
subject=email_subject,
fail_silently=True,
)
EmailRecord.objects.create(
sender=sender.user,
recipient=member.user.user,
email=member.user.user.email,
subject=email_subject,
body=email_body_text,
ok=success
)
def show_common_event(request, event_id, event_slug):
event = get_object_or_404(CommonEvent, id=event_id)
context = {
'org': event.organization,
'common_event': event,
'participating_events': event.participating_events.all().order_by('start_time'),
'can_edit_event': request.user.profile.can_create_common_event(event.organization),
}
return render(request, 'get_together/orgs/show_common_event.html', context)
@login_required
def create_common_event(request, org_slug):
org = get_object_or_404(Organization, slug=org_slug)
if not request.user.profile.can_create_common_event(org):
messages.add_message(request, messages.WARNING, message=_('You can not create events for this org.'))
return redirect('show-org', org_id=org.pk)
new_event = CommonEvent(organization=org, created_by=request.user.profile)
if request.method == 'GET':
form = CommonEventForm(instance=new_event)
context = {
'org': org,
'event_form': form,
}
return render(request, 'get_together/orgs/create_common_event.html', context)
elif request.method == 'POST':
form = CommonEventForm(request.POST, instance=new_event)
if form.is_valid:
new_event = form.save()
send_common_event_invite(new_event)
return redirect('show-common-event', new_event.id, new_event.slug)
else:
context = {
'org': org,
'event_form': form,
}
return render(request, 'get_together/orgs/create_common_event.html', context)
else:
return redirect('home')
def send_common_event_invite(event):
context = {
'sender': event.created_by,
'org': event.organization,
'event': event,
'site': Site.objects.get(id=1),
}
email_subject = 'Participate in our event: %s' % event.name
email_from = getattr(settings, 'DEFAULT_FROM_EMAIL', 'noreply@gettogether.community')
teams = event.organization.teams.all()
if event.city:
teams = teams.filter(city=event.city)
elif event.spr:
teams = teams.filter(city__spr=event.spr)
elif event.country:
teams = teams.filter(city__spr__country=event.country)
for admin in Member.objects.filter(team__in=teams, role=Member.ADMIN, user__user__account__is_email_confirmed=True):
context['team'] = admin.team
email_body_text = render_to_string('get_together/emails/orgs/invite_to_common_event.txt', context)
email_body_html = render_to_string('get_together/emails/orgs/invite_to_common_event.html', context)
success = send_mail(
from_email=email_from,
html_message=email_body_html,
message=email_body_text,
recipient_list=[admin.user.user.email],
subject=email_subject,
fail_silently=True,
)
EmailRecord.objects.create(
sender=event.created_by.user,
recipient=admin.user.user,
email=admin.user.user.email,
subject=email_subject,
body=email_body_text,
ok=success
)
@login_required
def create_common_event_team_select(request, event_id):
teams = request.user.profile.moderating
if len(teams) == 1:
return redirect(reverse('create-event', kwargs={'team_id':teams[0].id}) + '?common=%s'%event_id)
context = {
'common_event_id': event_id,
'teams': teams
}
return render(request, 'get_together/orgs/create_common_event_team_select.html', context)
@login_required
def edit_common_event(request, event_id):
event = get_object_or_404(CommonEvent, id=event_id)
org = event.organization
if not request.user.profile.can_create_common_event(org):
messages.add_message(request, messages.WARNING, message=_('You can not edit events for this org.'))
return redirect('show-org', org_id=org.pk)
if request.method == 'GET':
form = CommonEventForm(instance=event)
context = {
'org': org,
'event': event,
'event_form': form,
}
return render(request, 'get_together/orgs/edit_common_event.html', context)
elif request.method == 'POST':
form = CommonEventForm(request.POST, instance=event)
if form.is_valid():
new_event = form.save()
return redirect('show-common-event', new_event.id, new_event.slug)
else:
context = {
'org': org,
'event': event,
'event_form': form,
}
return render(request, 'get_together/orgs/edit_common_event.html', context)
else:
return redirect('home')