Advertisement
Guest User

Untitled

a guest
Jul 28th, 2011
123
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.22 KB | None | 0 0
  1. class ModelMixin(object):
  2. queryset = None
  3.  
  4. def read(self, *args, **kwargs):
  5. model = self.resource.model
  6.  
  7. try:
  8. if args:
  9. # If we have any none kwargs then assume the last represents the primrary key
  10. self.model_instance = model.objects.get(pk=args[-1], **kwargs)
  11. else:
  12. # Otherwise assume the kwargs uniquely identify the model
  13. filtered_keywords = kwargs.copy()
  14. if BaseRenderer._FORMAT_QUERY_PARAM in filtered_keywords:
  15. del filtered_keywords[BaseRenderer._FORMAT_QUERY_PARAM]
  16. self.model_instance = model.objects.get(**filtered_keywords)
  17. except model.DoesNotExist:
  18. raise ErrorResponse(status.HTTP_404_NOT_FOUND)
  19.  
  20. return self.model_instance
  21.  
  22.  
  23. def create(self, data, *args, **kwargs):
  24. model = self.resource.model
  25.  
  26. # Copy the dict to keep original intact
  27. content = dict(data)
  28. m2m_data = {}
  29.  
  30. for field in model._meta.fields:
  31. if isinstance(field, ForeignKey) and kwargs.has_key(field.name):
  32. # translate 'related_field' kwargs into 'related_field_id'
  33. kwargs[field.name + '_id'] = kwargs[field.name]
  34. del kwargs[field.name]
  35.  
  36. for field in model._meta.many_to_many:
  37. if content.has_key(field.name):
  38. m2m_data[field.name] = (
  39. field.m2m_reverse_field_name(), content[field.name]
  40. )
  41. del content[field.name]
  42.  
  43. all_kw_args = dict(content.items() + kwargs.items())
  44.  
  45. if args:
  46. instance = model(pk=args[-1], **all_kw_args)
  47. else:
  48. instance = model(**all_kw_args)
  49. instance.save()
  50.  
  51. for fieldname in m2m_data:
  52. manager = getattr(instance, fieldname)
  53.  
  54. if hasattr(manager, 'add'):
  55. manager.add(*m2m_data[fieldname][1])
  56. else:
  57. data = {}
  58. data[manager.source_field_name] = instance
  59.  
  60. for related_item in m2m_data[fieldname][1]:
  61. data[m2m_data[fieldname][0]] = related_item
  62. manager.through(**data).save()
  63.  
  64. return instance
  65.  
  66.  
  67. def update(self, data, *args, **kwargs):
  68. model = self.resource.model
  69.  
  70. # TODO: update on the url of a non-existing resource url doesn't work correctly at the moment - will end up with a new url
  71. try:
  72. if args:
  73. # If we have any none kwargs then assume the last represents the primrary key
  74. self.model_instance = model.objects.get(pk=args[-1], **kwargs)
  75. else:
  76. # Otherwise assume the kwargs uniquely identify the model
  77. self.model_instance = model.objects.get(**kwargs)
  78.  
  79. for (key, val) in data.items():
  80. setattr(self.model_instance, key, val)
  81. except model.DoesNotExist:
  82. self.model_instance = model(**data)
  83. self.model_instance.save()
  84.  
  85. self.model_instance.save()
  86. return self.model_instance
  87.  
  88.  
  89. def deletion(self, *args, **kwargs):
  90. model = self.resource.model
  91.  
  92. try:
  93. if args:
  94. # If we have any none kwargs then assume the last represents the primrary key
  95. instance = model.objects.get(pk=args[-1], **kwargs)
  96. else:
  97. # Otherwise assume the kwargs uniquely identify the model
  98. instance = model.objects.get(**kwargs)
  99. except model.DoesNotExist:
  100. raise ErrorResponse(status.HTTP_404_NOT_FOUND)
  101.  
  102. instance.delete()
  103. return
  104.  
  105.  
  106. def list(self, *args, **kwargs):
  107. model = self.resource.model
  108.  
  109. queryset = self.queryset if self.queryset is not None else model.objects.all()
  110.  
  111. if hasattr(self, 'resource'):
  112. ordering = getattr(self.resource, 'ordering', None)
  113. else:
  114. ordering = None
  115.  
  116. if ordering:
  117. args = as_tuple(ordering)
  118. queryset = queryset.order_by(*args)
  119. return queryset.filter(**kwargs)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement