Attribute artist

This commit is contained in:
Eliot Berriot 2019-04-11 10:17:10 +02:00
commit 4e44e4e4b6
31 changed files with 1741 additions and 46 deletions

View file

@ -2,7 +2,7 @@ import persisting_theory
from rest_framework import serializers
from django.db import models
from django.db import models, transaction
class ConfNotFound(KeyError):
@ -23,6 +23,7 @@ class Registry(persisting_theory.Registry):
return decorator
@transaction.atomic
def apply(self, type, obj, payload):
conf = self.get_conf(type, obj)
serializer = conf["serializer_class"](obj, data=payload)
@ -73,6 +74,9 @@ class MutationSerializer(serializers.Serializer):
def apply(self, obj, validated_data):
raise NotImplementedError()
def post_apply(self, obj, validated_data):
pass
def get_previous_state(self, obj, validated_data):
return
@ -88,8 +92,11 @@ class UpdateMutationSerializer(serializers.ModelSerializer, MutationSerializer):
kwargs.setdefault("partial", True)
super().__init__(*args, **kwargs)
@transaction.atomic
def apply(self, obj, validated_data):
return self.update(obj, validated_data)
r = self.update(obj, validated_data)
self.post_apply(r, validated_data)
return r
def validate(self, validated_data):
if not validated_data:

View file

@ -201,3 +201,30 @@ def concat_dicts(*dicts):
n.update(d)
return n
def get_updated_fields(conf, data, obj):
"""
Given a list of fields, a dict and an object, will return the dict keys/values
that differ from the corresponding fields on the object.
"""
final_conf = []
for c in conf:
if isinstance(c, str):
final_conf.append((c, c))
else:
final_conf.append(c)
final_data = {}
for data_field, obj_field in final_conf:
try:
data_value = data[data_field]
except KeyError:
continue
obj_value = getattr(obj, obj_field)
if obj_value != data_value:
final_data[obj_field] = data_value
return final_data