def post(self, request, *args, **kwargs): if request.is_ajax(): for data in simplejson.loads(request.POST.get('imageData')): image = Image.objects.get(pk=data['image_pk']) try: parsed = parseKeyValueTags(data['value']) image.keyvaluetags.all().delete() for tag in parsed: KeyValueTag.objects.create(image=image, key=tag["key"], value=tag["value"]) except ValueError: return self.render_json_response({ 'error': _("Provide a list of unique key/value pairs to tag this image with. Use the '=' symbol " "between key and value, and provide one pair per line. These tags can be used to sort " "images by arbitrary properties."), 'image_pk': data['image_pk'] }) messages.success(request, _("Images updated!")) return self.render_json_response({ 'images': ','.join([str(x.pk) for x in self.get_object().images.all()]), }) else: return super(UserCollectionsQuickEditKeyValueTags, self).post(request, *args, **kwargs)
def test_parse_key_value_tags_success_multiple_rn(self): self.assertEqual([{ "key": "a", "value": "1" }, { "key": "b", "value": "2" }], parseKeyValueTags("a=1\r\nb=2"))
def __saveKeyValueTags(self, instance): instance.keyvaluetags.all().delete() if 'keyvaluetags' in self.data: tags = self.data['keyvaluetags'] if tags is None: return for tag in parseKeyValueTags(tags): KeyValueTag.objects.create(image=instance, key=tag["key"], value=tag["value"])
def to_internal_value(self, data): instance = self.parent.instance instance.keyvaluetags.all().delete() value = [] if data is None: return value for tag in parseKeyValueTags(data): value.append( KeyValueTag.objects.create(image=instance, key=tag["key"], value=tag["value"])) return value
def __saveKeyValueTags(self, instance): instance.keyvaluetags.all().delete() if 'keyvaluetags' in self.data: tags = self.data['keyvaluetags'] if tags is None: return try: for tag in parseKeyValueTags(tags): KeyValueTag.objects.create(image=instance, key=tag["key"], value=tag["value"]) except ValueError: raise forms.ValidationError(_("Unable to parse."))
def to_internal_value(self, data): instance = self.parent.instance instance.keyvaluetags.all().delete() value = [] if data is None: return value try: for tag in parseKeyValueTags(data): value.append( KeyValueTag.objects.create(image=instance, key=tag["key"], value=tag["value"])) except ValueError: log.error(f'KeyValueTagsSerializerField: unable to parse: {data}') return value
def clean_keyvaluetags(self): try: parsed = parseKeyValueTags(self.cleaned_data['keyvaluetags']) except ValueError: raise forms.ValidationError(_("Unable to parse."))
def test_parse_key_value_tags_empty_tags(self): self.assertEqual([], parseKeyValueTags(""))
def test_parse_key_value_tags_success_non_ascii(self): self.assertEqual([{ "key": "你好", "value": "再见" }], parseKeyValueTags("你好=再见"))
def test_parse_key_value_tags_success(self): self.assertEqual([{ "key": "a", "value": "1" }], parseKeyValueTags("a=1"))
def test_parse_key_value_tags_success_number_key(self): self.assertEqual([{ "key": "2", "value": "1" }], parseKeyValueTags("2=1"))
def test_parse_key_value_tags_two_equals(self): with self.assertRaises(ValueError): parseKeyValueTags("a=1=2")
def test_parse_key_value_tags_double_equals(self): with self.assertRaises(ValueError): parseKeyValueTags("a==1")
def test_parse_key_value_tags_duplicate_key(self): with self.assertRaises(ValueError): parseKeyValueTags("a=1\na=2")
def test_parse_key_value_tags_missing_key_and_value(self): with self.assertRaises(ValueError): parseKeyValueTags("=")
def test_parse_key_value_tags_none_tags(self): self.assertEqual([], parseKeyValueTags(None))