def set_up(): def preferences_value_callback(field_name, user): return CodeSharingSettings.objects.sharing_allowed(user) @transaction.atomic def on_preferences_saved(sender, **kwargs): if 'code_sharing' in sender.cleaned_data: obj, created = CodeSharingSettings.objects.get_or_create( user=sender.instance ) obj.code_share_allowed = sender.cleaned_data['code_sharing'] obj.save() CodeSharingController.mix_in(CodeSharingFriendsController) PreferencesFactory.add_field( 'code_sharing', BooleanField, preferences_value_callback, label=_("Whether to allow your friends to see your problem " "solutions"), required=False ) # django.dispatch.Signal stores callback function with weak reference # by default - and because we pass there local function it is # immediately garbage collected; we need to turn off weak reference. PreferencesSaved.connect(on_preferences_saved, weak=False)
def edit_profile_view(request): if request.method == "POST": form = PreferencesFactory().create_form( request.user, request.POST, allow_login_change=not has_valid_username(request.user) ) if form.is_valid(): form.save() return redirect("index") else: form = PreferencesFactory().create_form(request.user, allow_login_change=not has_valid_username(request.user)) return TemplateResponse(request, "registration/registration_form.html", {"form": form})
def set_up(): def preferences_value_callback(field_name, user): return CodeSharingSettings.objects.sharing_allowed(user) @transaction.atomic def on_preferences_saved(sender, **kwargs): obj, created = CodeSharingSettings.get_or_create( user=sender.user ) obj.code_share_allowed = sender.cleaned_data['code_sharing'] obj.save() CodeSharingController.mix_in(CodeSharingFriendsController) PreferencesFactory.add_field( 'code_sharing', BooleanField, preferences_value_callback, label=_("Whether to allow your friends to see your problem " "solutions"), required=False ) PreferencesSaved.connect(on_preferences_saved)
def edit_profile_view(request): if request.method == 'POST': form = PreferencesFactory().create_form( request.user, request.POST, allow_login_change=not has_valid_username(request.user)) if form.is_valid(): form.save() return redirect('index') else: form = PreferencesFactory().create_form( request.user, allow_login_change=not has_valid_username(request.user)) return TemplateResponse(request, 'registration/registration_form.html', {'form': form})
def test_profile_dynamic_fields(self): from oioioi.base.preferences import PreferencesFactory, \ PreferencesSaved def callback_func(sender, **kwargs): self.assertEquals(sender.cleaned_data['dog'], 'Janusz') self.assertEquals(sender.cleaned_data['answer'], 42) try: PreferencesFactory.add_field('dog', CharField, lambda n, u: 'Andrzej', label='Doggy') PreferencesFactory.add_field('answer', IntegerField, lambda n, u: 72, label="The answer to everything") PreferencesSaved.connect(callback_func) self.client.login(username='******') url = reverse('edit_profile') response = self.client.get(url) for text in ['Doggy', 'Andrzej', '72', 'The answer to everything']: self.assertIn(text, response.content) data = { 'username': '******', 'first_name': 'fn', 'last_name': 'ln', 'email': '*****@*****.**', 'dog': 'Janusz', 'answer': '42' } self.client.post(url, data, follow=True) # callback_func should be called already finally: PreferencesSaved.disconnect(callback_func) PreferencesFactory.remove_field('dog') PreferencesFactory.remove_field('answer')
def test_profile_dynamic_fields(self): from oioioi.base.preferences import PreferencesFactory from oioioi.base.models import PreferencesSaved def callback_func(sender, **kwargs): self.assertEqual(sender.cleaned_data['dog'], 'Janusz') self.assertEqual(sender.cleaned_data['answer'], 42) try: PreferencesFactory.add_field( 'dog', CharField, lambda n, u: 'Andrzej', label='Doggy' ) PreferencesFactory.add_field( 'answer', IntegerField, lambda n, u: 72, label="The answer to everything" ) PreferencesSaved.connect(callback_func) self.assertTrue(self.client.login(username='******')) url = reverse('edit_profile') response = self.client.get(url) for text in ['Doggy', 'Andrzej', '72', 'The answer to everything']: self.assertContains(response, text) data = {'username': '******', 'first_name': 'fn', 'last_name': 'ln', 'email': '*****@*****.**', 'dog': 'Janusz', 'answer': '42'} self.client.post(url, data, follow=True) # callback_func should be called already finally: PreferencesSaved.disconnect(callback_func) PreferencesFactory.remove_field('dog') PreferencesFactory.remove_field('answer')
def form_class(self, instance=None, *args, **kwargs): return PreferencesFactory().create_form(RegistrationFormWithNames, instance, *args, **kwargs)
def _maybe_add_field(label, *args, **kwargs): if (label): kwargs.setdefault('label', label) PreferencesFactory.add_field(*args, **kwargs)