Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • hansegucker/AlekSIS-Core
  • pinguin/AlekSIS-Core
  • AlekSIS/official/AlekSIS-Core
  • sunweaver/AlekSIS-Core
  • sggua/AlekSIS-Core
  • edward/AlekSIS-Core
  • magicfelix/AlekSIS-Core
7 results
Show changes
Commits on Source (4)
......@@ -29,6 +29,58 @@ import PersonDetailsCard from "../person/PersonDetailsCard.vue";
</v-card-actions>
</v-card>
</div>
<div v-else-if="checkPermission('core.invite_enabled') && !invitationCodeEntered">
<v-card>
<v-card-title>
{{ $t("accounts.signup.form.steps.invitation.title") }}
</v-card-title>
<v-card-text>
<v-alert v-if="invitationCodeAutofilled" type="info" outlined class="mb-4">{{
$t("accounts.signup.form.steps.invitation.autofilled")
}}</v-alert>
<div class="mb-4">
<v-form v-model="invitationCodeValidationStatus">
<div :aria-required="invitationCodeRequired">
<v-text-field
outlined
v-model="data.invitationCode"
:label="
$t(
'accounts.signup.form.steps.invitation.fields.invitation_code.label',
)
"
:hint="
$t(
'accounts.signup.form.steps.invitation.fields.invitation_code.help_text',
)
"
persistent-hint
required
:rules="
invitationCodeRequired
? $rules().required.build()
: []
"
></v-text-field>
</div>
</v-form>
</div>
<v-alert v-if="invitationCodeInvalid" type="error" outlined class="mb-4">{{
$t("accounts.signup.form.steps.invitation.not_valid")
}}</v-alert>
</v-card-text>
<v-card-actions>
<v-spacer />
<primary-action-button
@click="checkInvitationCode"
:i18n-key="invitationNextI18nKey"
:disabled="
!invitationCodeValidationStatus
"
/>
</v-card-actions>
</v-card>
</div>
<div v-else>
<v-alert type="info" dense outlined class="mb-4">
<v-row align="center" no-gutters>
......@@ -62,55 +114,6 @@ import PersonDetailsCard from "../person/PersonDetailsCard.vue";
</template>
</v-stepper-header>
<v-stepper-items>
<v-stepper-content
v-if="isStepEnabled('invitation')"
:step="getStepIndex('invitation')"
>
<h2 class="text-h6 mb-4">{{ $t(getStepTitleKey("invitation")) }}</h2>
<v-alert v-if="invitationCodeAutofilled" type="info" outlined class="mb-4">{{
$t("accounts.signup.form.steps.invitation.autofilled")
}}</v-alert>
<div class="mb-4">
<v-form v-model="validationStatuses['invitation']">
<div :aria-required="invitationCodeRequired">
<v-text-field
outlined
v-model="data.invitationCode"
:label="
$t(
'accounts.signup.form.steps.invitation.fields.invitation_code.label',
)
"
:hint="
$t(
'accounts.signup.form.steps.invitation.fields.invitation_code.help_text',
)
"
persistent-hint
required
:rules="
invitationCodeRequired
? $rules().required.build()
: []
"
></v-text-field>
</div>
</v-form>
<v-alert v-if="invitationCodeInvalid" type="error" outlined class="mt-4">{{
$t("accounts.signup.form.steps.invitation.not_valid")
}}</v-alert>
</div>
<v-divider class="mb-4" />
<control-row
:step="step"
@set-step="checkInvitationCode"
:next-i18n-key="invitationNextI18nKey"
:next-disabled="
!validationStatuses['invitation']
"
/>
</v-stepper-content>
<v-stepper-content
v-if="isStepEnabled('email')"
:step="getStepIndex('email')"
......@@ -619,6 +622,14 @@ export default {
code: this.data.invitationCode,
};
},
result({ data, loading, networkStatus }) {
if (data?.personInvitationByCode?.valid) {
this.invitation = data.personInvitationByCode;
this.invitationCodeEntered = true;
} else {
this.invitationCodeInvalid = true;
}
},
skip: true,
},
},
......@@ -628,18 +639,14 @@ export default {
this.step = step;
this.valid = false;
},
checkInvitationCode(step) {
checkInvitationCode() {
this.invitationCodeInvalid = false;
this.$apollo.queries.personInvitationByCode.skip = false;
this.$apollo.queries.personInvitationByCode.options.result = ({ data, loading, networkStatus }) => {
if (data?.personInvitationByCode?.valid) {
this.invitation = data.personInvitationByCode;
this.setStep(step);
} else {
this.invitationCodeInvalid = true;
}
};
this.$apollo.queries.personInvitationByCode.refetch();
if (this.data.invitationCode) {
this.$apollo.queries.personInvitationByCode.skip = false;
this.$apollo.queries.personInvitationByCode.refetch();
} else {
this.invitationCodeEntered = true;
}
},
accountRegistrationDone({ data }) {
if (data.sendAccountRegistration.ok) {
......@@ -714,7 +721,7 @@ export default {
user: filteredUserData,
};
if (!this.data.email.localPart && !this.data.email.domain) {
if (!this.data.email.localPart && !this.data.email.domain?.id) {
const { email, ...filteredData } = data;
data = filteredData;
} else {
......@@ -755,14 +762,6 @@ export default {
},
steps() {
return [
...(this.checkPermission("core.invite_enabled")
? [
{
name: "invitation",
titleKey: "accounts.signup.form.steps.invitation.title",
},
]
: []),
...(this.collectionSteps.some(
(s) => s.key === "postbuero-mail-address-form-step",
) && !this.invitation?.hasEmail
......@@ -820,6 +819,8 @@ export default {
return {
validationStatuses: {},
invitation: null,
invitationCodeEntered: false,
invitationCodeValidationStatus: false,
invitationCodeInvalid: false,
invitationCodeAutofilled: false,
accountRegistrationSent: false,
......
......@@ -1398,7 +1398,7 @@ class PersonInvitation(AbstractBaseInvitation, PureDjangoModel):
def send_invitation(self, request, **kwargs):
"""Send the invitation email to the person."""
# TODO: Use correct URL to new signup wizard
invite_url = reverse("invitations:accept-invite", args=[self.key])
invite_url = f"{reverse("account_signup")}?invitation_code={self.key}"
invite_url = request.build_absolute_uri(invite_url).replace("/django", "")
context = kwargs
context.update(
......
......@@ -503,6 +503,7 @@ class SendAccountRegistrationMutation(PersonAddressMutationMixin, graphene.Mutat
# Create email
email = None
_mail_address = None
if invitation and invitation.email:
email = invitation.email
......
......@@ -107,15 +107,15 @@ urlpatterns = [
views.DAVSingleResourceView.as_view(),
name="dav_resource_contact",
),
path(
"accounts/signup/", views.TemplateView.as_view(template_name="core/vue_index.html"), name="account_signup"
),
path("", include("django_prometheus.urls")),
path(
"django/",
include(
[
path("account/login/", views.LoginView.as_view(), name="login"),
path(
"accounts/signup/", views.AccountRegisterView.as_view(), name="account_signup"
),
path("accounts/logout/", views.CustomLogoutView.as_view(), name="logout"),
path(
"accounts/password/change/",
......