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)
......@@ -233,7 +233,7 @@ import PersonDetailsCard from "../person/PersonDetailsCard.vue";
></v-text-field>
</div>
</v-col>
<v-col>
<v-col v-if="isFieldVisible('additional_name')">
<div :aria-required="isFieldRequired('additional_name')">
<v-text-field
outlined
......@@ -285,7 +285,7 @@ import PersonDetailsCard from "../person/PersonDetailsCard.vue";
<div class="mb-4">
<v-form v-model="validationStatuses['address_data']">
<v-row>
<v-col cols="12" lg="6">
<v-col cols="12" lg="6" v-if="isFieldVisible('street')">
<div :aria-required="isFieldRequired('street')">
<v-text-field
outlined
......@@ -304,7 +304,7 @@ import PersonDetailsCard from "../person/PersonDetailsCard.vue";
></v-text-field>
</div>
</v-col>
<v-col cols="12" lg="6">
<v-col cols="12" lg="6" v-if="isFieldVisible('housenumber')">
<div :aria-required="isFieldRequired('housenumber')">
<v-text-field
outlined
......@@ -325,7 +325,7 @@ import PersonDetailsCard from "../person/PersonDetailsCard.vue";
</v-col>
</v-row>
<v-row>
<v-col cols="12" lg="4">
<v-col cols="12" lg="4" v-if="isFieldVisible('postal_code')">
<div :aria-required="isFieldRequired('postal_code')">
<v-text-field
outlined
......@@ -344,7 +344,7 @@ import PersonDetailsCard from "../person/PersonDetailsCard.vue";
></v-text-field>
</div>
</v-col>
<v-col cols="12" lg="4">
<v-col cols="12" lg="4" v-if="isFieldVisible('place')">
<div :aria-required="isFieldRequired('place')">
<v-text-field
outlined
......@@ -363,7 +363,7 @@ import PersonDetailsCard from "../person/PersonDetailsCard.vue";
></v-text-field>
</div>
</v-col>
<v-col cols="12" lg="4">
<v-col cols="12" lg="4" v-if="isFieldVisible('country')">
<div :aria-required="isFieldRequired('country')">
<country-field
outlined
......@@ -400,7 +400,7 @@ import PersonDetailsCard from "../person/PersonDetailsCard.vue";
<div class="mb-4">
<v-form v-model="validationStatuses['contact_data']">
<v-row>
<v-col cols="12" md="6">
<v-col cols="12" md="6" v-if="isFieldVisible('mobile_number')">
<div :aria-required="isFieldRequired('mobile_number')">
<v-text-field
outlined
......@@ -420,7 +420,7 @@ import PersonDetailsCard from "../person/PersonDetailsCard.vue";
></v-text-field>
</div>
</v-col>
<v-col cols="12" md="6">
<v-col cols="12" md="6" v-if="isFieldVisible('phone_number')">
<div :aria-required="isFieldRequired('phone_number')">
<v-text-field
outlined
......@@ -458,7 +458,7 @@ import PersonDetailsCard from "../person/PersonDetailsCard.vue";
<div class="mb-4">
<v-form v-model="validationStatuses['additional_data']">
<v-row>
<v-col cols="12" md="6">
<v-col cols="12" md="6" v-if="isFieldVisible('date_of_birth')">
<div :aria-required="isFieldRequired('date_of_birth')">
<date-field
outlined
......@@ -478,7 +478,7 @@ import PersonDetailsCard from "../person/PersonDetailsCard.vue";
/>
</div>
</v-col>
<v-col cols="12" md="6">
<v-col cols="12" md="6" v-if="isFieldVisible('place_of_birth')">
<div :aria-required="isFieldRequired('place_of_birth')">
<v-text-field
outlined
......@@ -499,7 +499,7 @@ import PersonDetailsCard from "../person/PersonDetailsCard.vue";
</v-col>
</v-row>
<v-row>
<v-col cols="12" md="6">
<v-col cols="12" md="6" v-if="isFieldVisible('sex')">
<div :aria-required="isFieldRequired('sex')">
<sex-select
outlined
......@@ -518,7 +518,7 @@ import PersonDetailsCard from "../person/PersonDetailsCard.vue";
/>
</div>
</v-col>
<v-col cols="12" md="6">
<v-col cols="12" md="6" v-if="isFieldVisible('photo')">
<div :aria-required="isFieldRequired('photo')">
<file-field
outlined
......@@ -540,7 +540,7 @@ import PersonDetailsCard from "../person/PersonDetailsCard.vue";
</v-col>
</v-row>
<v-row>
<v-col cols="12">
<v-col cols="12" v-if="isFieldVisible('description')">
<div :aria-required="isFieldRequired('description')">
<v-text-field
outlined
......@@ -572,7 +572,9 @@ import PersonDetailsCard from "../person/PersonDetailsCard.vue";
<v-stepper-content :step="getStepIndex('confirm')">
<h2 class="text-h6 mb-4">{{ $t(getStepTitleKey("confirm")) }}</h2>
<!-- TODO: this should somehow also indicate whether an invitation code was used -->
<v-alert v-if="invitation && (invitation.hasEmail || invitation.hasPerson)" type="info" outlined class="mb-4">{{
$t("accounts.signup.form.steps.confirm.invitation_used")
}}</v-alert>
<person-details-card class="mb-4" :person="personDataForSummary" :show-username="true" title-key="accounts.signup.form.steps.confirm.card_title" />
<ApolloMutation
......@@ -660,6 +662,13 @@ export default {
fieldName,
);
},
isFieldVisible(fieldName) {
return this?.systemProperties?.sitePreferences?.signupVisibleFields?.includes(
fieldName,
) || this?.systemProperties?.sitePreferences?.signupAddressVisibleFields?.includes(
fieldName,
);
},
isStepEnabled(stepName) {
return this.steps.some((s) => s.name === stepName);
},
......@@ -782,14 +791,26 @@ export default {
name: "base_data",
titleKey: "accounts.signup.form.steps.base_data.title",
},
]
: []),
...(!this.invitation?.hasPerson && (this.isFieldVisible("street") | this.isFieldVisible("housenumber") | this.isFieldVisible("postal_code") | this.isFieldVisible("place") | this.isFieldVisible("country"))
? [
{
name: "address_data",
titleKey: "accounts.signup.form.steps.address_data.title",
},
]
: []),
...(!this.invitation?.hasPerson && (this.isFieldVisible("mobile_number") | this.isFieldVisible("phone_number"))
? [
{
name: "contact_data",
titleKey: "accounts.signup.form.steps.contact_data.title",
},
]
: []),
...(!this.invitation?.hasPerson && (this.isFieldVisible("date_of_birth") | this.isFieldVisible("place_of_birth") | this.isFieldVisible("sex") | this.isFieldVisible("photo") | this.isFieldVisible("description"))
? [
{
name: "additional_data",
titleKey: "accounts.signup.form.steps.additional_data.title",
......
......@@ -3,6 +3,8 @@ query gqlRequiredFieldsPreference {
sitePreferences {
signupRequiredFields
signupAddressRequiredFields
signupVisibleFields
signupAddressVisibleFields
}
}
}
......
......@@ -165,6 +165,7 @@
},
"confirm": {
"title": "Confirm account registration",
"invitation_used": "Some personal data will be taken over from the data associated with the invitation you accepted.",
"card_title": "Your account data"
}
},
......
......@@ -30,7 +30,6 @@ const routes = [
invalidate: "leave",
},
},
// TODO: Use rule checking (maybe) and add invitation code to URL
{
path: "/accounts/signup/",
name: "core.accounts.signup",
......@@ -40,25 +39,11 @@ const routes = [
icon: "mdi-account-plus-outline",
iconActive: "mdi-account-plus",
titleKey: "accounts.signup.menu_title",
validators: [signupEnabledValidator, notLoggedInValidator],
validators: [notLoggedInValidator],
permission: "core.signup_menu_rule",
invalidate: "leave",
},
},
{
path: "/invitations/code/enter/",
name: "core.invitations.enterCode",
component: () => import("./components/LegacyBaseTemplate.vue"),
props: {
byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
},
meta: {
inMenu: true,
icon: "mdi-key-outline",
iconActive: "mdi-key-outline",
titleKey: "accounts.invitation.accept_invitation.menu_title",
validators: [inviteEnabledValidator, notLoggedInValidator],
},
},
{
path: "",
name: "dashboard",
......
......@@ -343,6 +343,46 @@ class SignupAddressRequiredFields(MultipleChoicePreference):
required = False
@site_preferences_registry.register
class SignupVisibleFields(MultipleChoicePreference):
"""Fields on person model which are visible when signing up."""
section = auth
name = "signup_visible_fields"
default = []
widget = SelectMultiple
verbose_name = _(
"Fields on person model which are visible when signing up. The first and last name fields are always visible."
)
field_attribute = {"initial": []}
choices = [
(field.name, field.name)
for field in Person.syncable_fields()
if getattr(field, "blank", False)
]
required = False
@site_preferences_registry.register
class SignupAddressVisibleFields(MultipleChoicePreference):
"""Fields on address model which are visible when signing up."""
section = auth
name = "signup_address_visible_fields"
default = []
widget = SelectMultiple
verbose_name = _(
"Fields on address model which are visible when signing up."
)
field_attribute = {"initial": []}
choices = [
(field.name, field.name)
for field in Address.syncable_fields()
if getattr(field, "blank", False)
]
required = False
@site_preferences_registry.register
class AllowedUsernameRegex(StringPreference):
section = auth
......
......@@ -368,18 +368,6 @@ rules.add_perm("core.edit_dashboard_rule", edit_dashboard_predicate)
edit_default_dashboard_predicate = has_person & has_global_perm("core.edit_default_dashboard")
rules.add_perm("core.edit_default_dashboard_rule", edit_default_dashboard_predicate)
# django-allauth
signup_predicate = is_site_preference_set(section="auth", pref="signup_enabled")
rules.add_perm("core.signup_rule", signup_predicate)
change_password_predicate = has_person & is_site_preference_set(
section="auth", pref="allow_password_change"
)
rules.add_perm("core.change_password_rule", change_password_predicate)
reset_password_predicate = is_site_preference_set(section="auth", pref="allow_password_reset")
rules.add_perm("core.reset_password_rule", reset_password_predicate)
# django-invitations
invite_enabled_predicate = is_site_preference_set(section="auth", pref="invite_enabled")
rules.add_perm("core.invite_enabled", invite_enabled_predicate)
......@@ -390,6 +378,21 @@ rules.add_perm("core.accept_invite_rule", accept_invite_predicate)
invite_predicate = has_person & invite_enabled_predicate & has_global_perm("core.invite")
rules.add_perm("core.invite_rule", invite_predicate)
# django-allauth
signup_enabled_predicate = is_site_preference_set(section="auth", pref="signup_enabled")
rules.add_perm("core.signup_rule", signup_enabled_predicate)
signup_menu_predicate = signup_enabled_predicate | invite_enabled_predicate
rules.add_perm("core.signup_menu_rule", signup_menu_predicate)
change_password_predicate = has_person & is_site_preference_set(
section="auth", pref="allow_password_change"
)
rules.add_perm("core.change_password_rule", change_password_predicate)
reset_password_predicate = is_site_preference_set(section="auth", pref="allow_password_reset")
rules.add_perm("core.reset_password_rule", reset_password_predicate)
# OAuth2 permissions
view_oauthapplication_predicate = has_person & has_global_perm("core.view_oauthapplication")
rules.add_perm("core.view_oauthapplication_rule", view_oauthapplication_predicate)
......
......@@ -492,6 +492,8 @@ class SendAccountRegistrationMutation(PersonAddressMutationMixin, graphene.Mutat
@classmethod
@transaction.atomic
def mutate(cls, root, info, account_registration: AccountRegistrationInputType):
invitation = None
if account_registration["invitation_code"]:
try:
invitation = PersonInvitation.objects.get(key=account_registration["invitation_code"])
......
......@@ -27,6 +27,8 @@ class SitePreferencesType(graphene.ObjectType):
signup_enabled = graphene.Boolean()
signup_required_fields = graphene.List(graphene.String)
signup_address_required_fields = graphene.List(graphene.String)
signup_visible_fields = graphene.List(graphene.String)
signup_address_visible_fields = graphene.List(graphene.String)
def resolve_general_title(parent, info, **kwargs):
return parent["general__title"]
......@@ -75,3 +77,9 @@ class SitePreferencesType(graphene.ObjectType):
def resolve_signup_address_required_fields(parent, info, **kwargs):
return parent["auth__signup_address_required_fields"]
def resolve_signup_visible_fields(parent, info, **kwargs):
return parent["auth__signup_visible_fields"]
def resolve_signup_address_required_fields(parent, info, **kwargs):
return parent["auth__signup_address_visible_fields"]