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 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, \ 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 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 save(self, *args, **kwargs): instance = super(UserForm, self).save(*args, **kwargs) PreferencesSaved.send(self) return instance