PK
HJRs s plugs_media/views.py"""
Plugs Media Views
"""
from django.contrib.contenttypes.models import ContentType
from rest_framework import permissions
from rest_framework.viewsets import ReadOnlyModelViewSet
from plugs_core import viewsets
from plugs_media import models
from plugs_media import serializers
from plugs_media.permissions import IsOwnerOrReadOnly
from plugs_filter.decorators import auto_filters
@auto_filters
class MediaViewSet(viewsets.CreateReadDestroyViewSet):
"""
Media Endpoint, does not support update
or delete operations
"""
queryset = models.Media.objects.all()
serializer_class = serializers.MediaSerializer
permission_classes = [IsOwnerOrReadOnly]
auto_filters_fields = ('content_type', 'object_id')
def perform_create(self, serializer):
serializer.save(user=self.request.user)
@auto_filters
class MediaContentTypeViewSet(ReadOnlyModelViewSet):
"""
Exposing Content Types
"""
queryset = ContentType.objects.all()
serializer_class = serializers.MediaContentTypeSerializer
permission_classes = [permissions.AllowAny]
auto_filters_fields = ('app_label', 'model')
PK o'Jg-
plugs_media/fields.py"""
Custom fields required by media
"""
from django.db import models
from plugs_media.widgets import MediaWidget
from plugs_media.validators import MediaValidator
class MediaField(models.CharField):
"""
This field is a special charfield
that accepts and stores chars but
references a resource in the media model
which for now are images
"""
default_validators = [MediaValidator()]
def __init__(self, *args, **kwargs):
kwargs['max_length'] = 100
super(MediaField, self).__init__(*args, **kwargs)
def formfield(self, **kwargs):
"""
Using this to provide a custom widget
in the admin site
"""
kwargs['widget'] = MediaWidget
return super(MediaField, self).formfield(**kwargs)
PK
HJD% plugs_media/serializers.pyfrom django.contrib.contenttypes.models import ContentType
from rest_framework import serializers
from plugs_media.models import Media
class MediaSerializer(serializers.ModelSerializer):
"""
Media Serializer
"""
file = serializers.FileField(
max_length=100,
allow_empty_file=False,
use_url=False
)
class Meta:
model = Media
fields = ('id', 'name', 'file', 'content_type', 'object_id', 'user', 'created', 'updated')
read_only_fields = ('user', )
class MediaContentTypeSerializer(serializers.ModelSerializer):
"""
Media Serializer
"""
class Meta:
model = ContentType
fields = ('id', 'app_label', 'model')
PK
HJ9 plugs_media/models.py"""
Plugs media models
"""
from django.conf import settings
from django.db import models
from django.contrib.contenttypes.fields import GenericForeignKey
from django.contrib.contenttypes.models import ContentType
from plugs_core import mixins
class Media(mixins.Timestampable, models.Model):
"""
Media Model
"""
name = models.CharField(max_length=255, null=True, blank=True)
file = models.FileField(max_length=255, upload_to='%Y/%m/%d/')
content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE, null=True)
object_id = models.PositiveIntegerField(null=True)
content_object = GenericForeignKey('content_type', 'object_id')
user = models.ForeignKey(settings.AUTH_USER_MODEL, null=True)
# pylint: disable=R0903
class Meta:
"""
Metaclass definition
"""
verbose_name = 'media'
verbose_name_plural = 'media'
PK ;'J#6t t plugs_media/apps.py# -*- coding: utf-8
from django.apps import AppConfig
class PlugsMediaConfig(AppConfig):
name = 'plugs_media'
PK
HJN6 plugs_media/permissions.pyfrom rest_framework import permissions
class IsOwnerOrReadOnly(permissions.BasePermission):
def has_object_permission(self, request, view, obj):
if request.method in permissions.SAFE_METHODS:
return True
return obj.user == request.user
PK
HJ# # plugs_media/validators.py"""
Plugs Media Validators
"""
from django.core.exceptions import ObjectDoesNotExist
from django.utils.translation import ugettext as _
from django.core.exceptions import ValidationError
from plugs_media.models import Media
from plugs_media.settings import plugs_media_settings
# pylint: disable=R0903
class MediaValidator(object):
"""
Validates if a string passed to a field
accepting media resources is in fact a media
resource
"""
message = _('This field must be a valid media resource.')
code = 'invalid_media'
def __call__(self, value):
if value in plugs_media_settings.values():
return
try:
Media.objects.get(file=value)
except ObjectDoesNotExist:
raise ValidationError(self.message, code=self.code)
PK HJ^x plugs_media/__init__.py__version__ = '0.1.4'
PK 'J plugs_media/widgets.py"""
Media Widgets
"""
from django.conf import settings
from django.forms.widgets import ClearableFileInput
class MediaWidget(ClearableFileInput):
"""
Media widget to deal with images
"""
def render(self, name, value, attrs=None):
output = super(MediaWidget, self).render(name, value, attrs)
img_html = '
'.format(settings.MEDIA_URL, value)
return img_html + output
PK o'Ju) plugs_media/exceptions.py"""
Media APP exceptions
"""
from django.utils.translation import ugettext as _
from rest_framework.exceptions import APIException
from rest_framework import status
class MediaException(APIException):
"""
Exception raised when the creation of a media resource fails
"""
status_code = status.HTTP_400_BAD_REQUEST
default_detail = _('Could not create media resource.')
PK ;'J!e plugs_media/urls.py# -*- coding: utf-8 -*-
from django.conf.urls import url
from django.views.generic import TemplateView
from . import views
urlpatterns = [
url(r'', TemplateView.as_view(template_name="base.html")),
]
PK
HJQT9 plugs_media/settings.py"""
Plugs Media Settings
"""
from django.conf import settings
PROJECT_SETTINGS = getattr(settings, 'PLUGS_MEDIA_DEFAULTS', {})
plugs_media_settings = PROJECT_SETTINGS
PK ;'J &