def post(self, request, *args, **kwargs): self.organization = self.get_object() if not self.request.user.is_authenticated: return redirect(self.organization) is_member = self.organization.has_member(self.request.user) if request.POST.get("action") == "join" and not is_member: self.organization.invitations.create(email=request.user.email, user=request.user, request=True) messages.success(request, _("Request to join the organization sent!")) send_mail( subject=_( f"{request.user} has requested to join {self.organization}" ), template="organizations/email/join_request.html", organization=self.organization, organization_to=ORG_TO_ADMINS, extra_context={"joiner": request.user}, ) elif request.POST.get("action") == "leave" and is_member: self.request.user.memberships.filter( organization=self.organization).delete() messages.success(request, _("You have left the organization")) mixpanel_event( request, "Left Organization", { "Name": self.organization.name, "UUID": str(self.organization.uuid) }, ) return redirect(self.organization)
def form_valid(self, form): """The organization creator is automatically a member and admin of the organization""" free_plan = Plan.objects.get(slug="free") organization = form.save(commit=False) organization.plan = free_plan organization.next_plan = free_plan organization.save() organization.add_creator(self.request.user) organization.change_logs.create( reason=OrganizationChangeLog.CREATED, user=self.request.user, to_plan=organization.plan, to_next_plan=organization.next_plan, to_max_users=organization.max_users, ) mixpanel_event( self.request, "Create Organization", { "Name": organization.name, "UUID": str(organization.uuid), "Plan": organization.plan.name, "Max Users": organization.max_users, "Sign Up": False, }, ) return redirect(organization)
def form_valid(self, form): organization = self.object old_plan = organization.plan old_users = organization.max_users try: organization.set_subscription( token=form.cleaned_data["stripe_token"], plan=form.cleaned_data["plan"], max_users=form.cleaned_data.get("max_users"), user=self.request.user, ) except stripe.error.StripeError as exc: messages.error(self.request, "Payment error: {}".format(exc.user_message)) else: organization.set_receipt_emails( form.cleaned_data["receipt_emails"]) messages.success( self.request, _("Plan Updated") if organization.individual else _("Organization Updated"), ) mixpanel_event( self.request, "Organization Subscription Changed", { "Name": organization.name, "UUID": str(organization.uuid), "Old Plan": old_plan.name, "New Plan": form.cleaned_data["plan"].name, "Old Users": old_users, "New Users": form.cleaned_data.get("max_users", 1), }, ) return redirect(organization)
def save(self, request): user_data = { "source": request.GET.get("intent", "squarelet").lower().strip()[:11] } user_data.update(self.cleaned_data) user, group_organization, error = User.objects.register_user(user_data) setup_user_email(request, user, []) mixpanel_event(request, "Sign Up", {"Source": f"Squarelet: {user.source}"}, signup=True) if group_organization is not None: mixpanel_event( request, "Create Organization", { "Name": group_organization.name, "UUID": str(group_organization.uuid), "Plan": group_organization.plan.name, "Max Users": group_organization.max_users, "Sign Up": True, }, ) if error: messages.error(request, error) return user
def remove_user(membership): membership.delete() mixpanel_event( request, "User Removed", { "Organization Name": membership.organization.name, "Organization UUID": str(membership.organization.uuid), "User UUID": str(membership.user.uuid), "User Username": membership.user.username, "User Name": membership.user.name, "User Email": membership.user.email, }, )
def accept_invite(invite): invite.accept() mixpanel_event( request, "Invitation Accepted by Admin", { "Organization Name": invite.organization.name, "Organization UUID": str(invite.organization.uuid), "User UUID": str(invite.user.uuid), "User Username": invite.user.username, "User Name": invite.user.name, "User Email": invite.user.email, }, )
def post(self, request, *args, **kwargs): self.organization = self.get_object() if not self.request.user.is_authenticated: return redirect(self.organization) is_member = self.organization.has_member(self.request.user) if request.POST.get("action") == "join" and not is_member: invitation = self.organization.invitations.create( email=request.user.email, user=request.user, request=True ) messages.success(request, _("Request to join the organization sent!")) invitation.send() elif request.POST.get("action") == "leave" and is_member: self.request.user.memberships.filter( organization=self.organization ).delete() messages.success(request, _("You have left the organization")) mixpanel_event( request, "Left Organization", {"Name": self.organization.name, "UUID": str(self.organization.uuid)}, ) return redirect(self.organization)
def post(self, request, *args, **kwargs): """Accept the invitation""" invitation = self.get_object() action = request.POST.get("action") if action == "accept": invitation.accept(self.request.user) messages.success(self.request, "Invitation accepted") mixpanel_event( request, "Invitation Accepted", { "Name": invitation.organization.name, "UUID": str(invitation.organization.uuid), }, ) return redirect(invitation.organization) elif action == "reject": invitation.reject() messages.warning(self.request, "Invitation rejected") return redirect(request.user) else: messages.error(self.request, "Invalid choice") return redirect(request.user)
def form_valid(self, form): """The organization creator is automatically a member and admin of the organization""" organization = form.save() organization.add_creator(self.request.user) organization.change_logs.create( reason=ChangeLogReason.created, user=self.request.user, to_plan=organization.plan, to_max_users=organization.max_users, ) mixpanel_event( self.request, "Create Organization", { "Name": organization.name, "UUID": str(organization.uuid), "Plan": organization.plan.name if organization.plan else "Free", "Max Users": organization.max_users, "Sign Up": False, }, ) return redirect(organization)