PK HJRssplugs_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') PKo'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 HJ9plugs_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#6ttplugs_media/apps.py# -*- coding: utf-8 from django.apps import AppConfig class PlugsMediaConfig(AppConfig): name = 'plugs_media' PK HJN6plugs_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) PKHJ^xplugs_media/__init__.py__version__ = '0.1.4' PK'Jplugs_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 PKo'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!eplugs_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 HJQT9plugs_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&plugs_media/static/css/plugs_media.cssPK;'J$plugs_media/static/js/plugs_media.jsPK}*JkM1plugs_media/migrations/0003_auto_20170109_2240.py# -*- coding: utf-8 -*- # Generated by Django 1.9.7 on 2017-01-09 22:40 from __future__ import unicode_literals from django.db import migrations, models import django.db.models.deletion class Migration(migrations.Migration): dependencies = [ ('contenttypes', '0002_remove_content_type_name'), ('plugs_media', '0002_auto_20170107_1957'), ] operations = [ migrations.AddField( model_name='media', name='content_type', field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='contenttypes.ContentType'), ), migrations.AddField( model_name='media', name='object_id', field=models.PositiveIntegerField(null=True), ), ] PK}*J)$1plugs_media/migrations/0005_auto_20170109_2258.py# -*- coding: utf-8 -*- # Generated by Django 1.9.7 on 2017-01-09 22:58 from __future__ import unicode_literals from django.db import migrations class Migration(migrations.Migration): dependencies = [ ('plugs_media', '0004_auto_20170109_2246'), ] operations = [ migrations.RemoveField( model_name='media', name='model', ), migrations.RemoveField( model_name='media', name='model_object', ), ] PK}*JJ1plugs_media/migrations/0004_auto_20170109_2246.py# -*- coding: utf-8 -*- # Generated by Django 1.9.7 on 2017-01-09 22:46 from __future__ import unicode_literals from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ ('plugs_media', '0003_auto_20170109_2240'), ] operations = [ migrations.RenameField( model_name='media', old_name='object_id', new_name='model_object', ), migrations.RemoveField( model_name='media', name='content_type', ), migrations.AddField( model_name='media', name='model', field=models.CharField(blank=True, max_length=255, null=True), ), ] PKo'J W1plugs_media/migrations/0002_auto_20170107_1957.py# -*- coding: utf-8 -*- # Generated by Django 1.9.7 on 2017-01-07 19:57 from __future__ import unicode_literals import datetime from django.db import migrations, models from django.utils.timezone import utc class Migration(migrations.Migration): dependencies = [ ('plugs_media', '0001_initial'), ] operations = [ migrations.AddField( model_name='media', name='created', field=models.DateTimeField(auto_now_add=True, default=datetime.datetime(2017, 1, 7, 19, 57, 23, 177843, tzinfo=utc)), preserve_default=False, ), migrations.AddField( model_name='media', name='file', field=models.FileField(default='', max_length=255, upload_to='%Y/%m/%d/'), preserve_default=False, ), migrations.AddField( model_name='media', name='name', field=models.CharField(blank=True, max_length=255, null=True), ), migrations.AddField( model_name='media', name='updated', field=models.DateTimeField(auto_now=True, default=datetime.datetime(2017, 1, 7, 19, 57, 47, 274570, tzinfo=utc)), preserve_default=False, ), ] PKo'J"plugs_media/migrations/__init__.pyPKo'JTgg&plugs_media/migrations/0001_initial.py# -*- coding: utf-8 -*- # Generated by Django 1.9.7 on 2017-01-07 19:51 from __future__ import unicode_literals from django.db import migrations, models class Migration(migrations.Migration): initial = True dependencies = [ ] operations = [ migrations.CreateModel( name='Media', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ], options={ 'verbose_name_plural': 'media', 'verbose_name': 'media', }, ), ] PK}*J|1plugs_media/migrations/0006_auto_20170109_2259.py# -*- coding: utf-8 -*- # Generated by Django 1.9.7 on 2017-01-09 22:59 from __future__ import unicode_literals from django.db import migrations, models import django.db.models.deletion class Migration(migrations.Migration): dependencies = [ ('contenttypes', '0002_remove_content_type_name'), ('plugs_media', '0005_auto_20170109_2258'), ] operations = [ migrations.AddField( model_name='media', name='content_type', field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='contenttypes.ContentType'), ), migrations.AddField( model_name='media', name='object_id', field=models.PositiveIntegerField(null=True), ), ] PK HJv)plugs_media/migrations/0007_media_user.py# -*- coding: utf-8 -*- # Generated by Django 1.9.7 on 2017-02-08 17:34 from __future__ import unicode_literals from django.conf import settings from django.db import migrations, models import django.db.models.deletion class Migration(migrations.Migration): dependencies = [ migrations.swappable_dependency(settings.AUTH_USER_MODEL), ('plugs_media', '0006_auto_20170109_2259'), ] operations = [ migrations.AddField( model_name='media', name='user', field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL), ), ] PK;'J+plugs_media/templates/plugs_media/base.html {% comment %} As the developer of this package, don't place anything here if you can help it since this allows developers to have interoperability between your template structure and their own. Example: Developer melding the 2SoD pattern to fit inside with another pattern:: {% extends "base.html" %} {% load static %} {% block extra_js %} {% block javascript %} {% endblock javascript %} {% endblock extra_js %} {% endcomment %} PK,HJ{{+plugs_media-0.1.4.dist-info/DESCRIPTION.rst============================= Plugs Media ============================= .. image:: https://badge.fury.io/py/plugs-media.png :target: https://badge.fury.io/py/plugs-media .. image:: https://travis-ci.org/ricardolobo/plugs-media.png?branch=master :target: https://travis-ci.org/ricardolobo/plugs-media Your project description goes here Documentation ------------- The full documentation is at https://plugs-media.readthedocs.io. Quickstart ---------- Install Plugs Media:: pip install plugs-media Add it to your `INSTALLED_APPS`: .. code-block:: python INSTALLED_APPS = ( ... 'plugs_media.apps.PlugsMediaConfig', ... ) Add Plugs Media's URL patterns: .. code-block:: python from plugs_media import urls as plugs_media_urls urlpatterns = [ ... url(r'^', include(plugs_media_urls)), ... ] Features -------- * TODO Running Tests ------------- Does the code actually work? :: source /bin/activate (myenv) $ pip install tox (myenv) $ tox Credits ------- Tools used in rendering this package: * Cookiecutter_ * `cookiecutter-djangopackage`_ .. _Cookiecutter: https://github.com/audreyr/cookiecutter .. _`cookiecutter-djangopackage`: https://github.com/pydanny/cookiecutter-djangopackage History ------- 0.1.0 (2017-01-07) ++++++++++++++++++ * First release on PyPI. PK,HJ*p9t)plugs_media-0.1.4.dist-info/metadata.json{"classifiers": ["Development Status :: 3 - Alpha", "Framework :: Django", "Framework :: Django :: 1.9", "Intended Audience :: Developers", "License :: OSI Approved :: BSD License", "Natural Language :: English", "Programming Language :: Python :: 2", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5"], "extensions": {"python.details": {"contacts": [{"email": "ricardolobo@soloweb.pt", "name": "Ricardo Lobo", "role": "author"}], "document_names": {"description": "DESCRIPTION.rst"}, "project_urls": {"Home": "https://github.com/ricardolobo/plugs-media"}}}, "extras": [], "generator": "bdist_wheel (0.26.0)", "keywords": ["plugs-media"], "license": "MIT", "metadata_version": "2.0", "name": "plugs-media", "run_requires": [{"requires": ["plugs-core (>=0.1.6)", "plugs-filter (>=0.1.0)"]}], "summary": "Your project description goes here", "version": "0.1.4"}PK+HJB)P )plugs_media-0.1.4.dist-info/top_level.txtplugs_media PK,HJndnn!plugs_media-0.1.4.dist-info/WHEELWheel-Version: 1.0 Generator: bdist_wheel (0.26.0) Root-Is-Purelib: true Tag: py2-none-any Tag: py3-none-any PK,HJ?$plugs_media-0.1.4.dist-info/METADATAMetadata-Version: 2.0 Name: plugs-media Version: 0.1.4 Summary: Your project description goes here Home-page: https://github.com/ricardolobo/plugs-media Author: Ricardo Lobo Author-email: ricardolobo@soloweb.pt License: MIT Keywords: plugs-media Platform: UNKNOWN Classifier: Development Status :: 3 - Alpha Classifier: Framework :: Django Classifier: Framework :: Django :: 1.9 Classifier: Intended Audience :: Developers Classifier: License :: OSI Approved :: BSD License Classifier: Natural Language :: English Classifier: Programming Language :: Python :: 2 Classifier: Programming Language :: Python :: 2.7 Classifier: Programming Language :: Python :: 3 Classifier: Programming Language :: Python :: 3.4 Classifier: Programming Language :: Python :: 3.5 Requires-Dist: plugs-core (>=0.1.6) Requires-Dist: plugs-filter (>=0.1.0) ============================= Plugs Media ============================= .. image:: https://badge.fury.io/py/plugs-media.png :target: https://badge.fury.io/py/plugs-media .. image:: https://travis-ci.org/ricardolobo/plugs-media.png?branch=master :target: https://travis-ci.org/ricardolobo/plugs-media Your project description goes here Documentation ------------- The full documentation is at https://plugs-media.readthedocs.io. Quickstart ---------- Install Plugs Media:: pip install plugs-media Add it to your `INSTALLED_APPS`: .. code-block:: python INSTALLED_APPS = ( ... 'plugs_media.apps.PlugsMediaConfig', ... ) Add Plugs Media's URL patterns: .. code-block:: python from plugs_media import urls as plugs_media_urls urlpatterns = [ ... url(r'^', include(plugs_media_urls)), ... ] Features -------- * TODO Running Tests ------------- Does the code actually work? :: source /bin/activate (myenv) $ pip install tox (myenv) $ tox Credits ------- Tools used in rendering this package: * Cookiecutter_ * `cookiecutter-djangopackage`_ .. _Cookiecutter: https://github.com/audreyr/cookiecutter .. _`cookiecutter-djangopackage`: https://github.com/pydanny/cookiecutter-djangopackage History ------- 0.1.0 (2017-01-07) ++++++++++++++++++ * First release on PyPI. PK,HJJ'C "plugs_media-0.1.4.dist-info/RECORDplugs_media/__init__.py,sha256=aBEbDvx4LMg8A1TJJR6dEHu8rQODVin528hLS_EDvuA,22 plugs_media/apps.py,sha256=qUVKiORxL3vtqYY9rsO37xkV2rm1DDU_Bu8pV7M5pUc,116 plugs_media/exceptions.py,sha256=p8A4gumvClMoXwFvxQ5yqpY5kK0CHKxZDamvKZdOHf4,389 plugs_media/fields.py,sha256=SmYnFWmZ1dcRyXFftEnLteJs4-UwD8TvGdFjo-gfRxQ,778 plugs_media/models.py,sha256=Lt3Tw5v9vAoOZ9oISlDHSg9IbjNCAg3jxotMSQE3anE,904 plugs_media/permissions.py,sha256=E5zPB0GD-1izqWrfbGsDXlIpfliI15GMosTSd7CyXz8,270 plugs_media/serializers.py,sha256=WwO1FLhjVtAxEwjgPO3f-uNHdWleuxMiDa9OxqprXRs,715 plugs_media/settings.py,sha256=yxziXg8ycvgYGDgU_v0Bn3V5FeIOttiqLhwDFTqx-Ow,169 plugs_media/urls.py,sha256=0aE3OlS81ikQ8hbKC4E3xEkCVOgvWRCVmNy9TXLQg7w,210 plugs_media/validators.py,sha256=-jYRvmc7SDzkob4HS9Gi9vShJ5T6-VuQYHfFjaqDUkU,803 plugs_media/views.py,sha256=qLuHXfj51QK3Vr34DIYOzshbXDBO-sF4W3TiB5BsWcY,1139 plugs_media/widgets.py,sha256=bzhz5i0u6AttKjNsPjMzvgSpQBLj75TyK0OZStFaIaE,431 plugs_media/migrations/0001_initial.py,sha256=PtN93BDk3GS4KZ2pWXQbjS5sqzkzrxlmv-YwMQdwWSE,615 plugs_media/migrations/0002_auto_20170107_1957.py,sha256=66CSXj-njomwwFg1YxKa7MreemKjhK2FBdqHoi_2gS8,1264 plugs_media/migrations/0003_auto_20170109_2240.py,sha256=cbuDY1wO_5RBkU8K3NHNvkQOzn2csuWuxnvh_kiahTo,782 plugs_media/migrations/0004_auto_20170109_2246.py,sha256=9CzS2758JoldTl2lw4RlbnqglD7lH5tqwh8-jRjOmqo,728 plugs_media/migrations/0005_auto_20170109_2258.py,sha256=olNBZQFVa_nHLZLtl7Z9MwDEFLj1Io0xSaUkYbOOK4E,502 plugs_media/migrations/0006_auto_20170109_2259.py,sha256=tPHav-i6IugactbsDycPthXwHpDMaA3i8ocd-kq2f6g,782 plugs_media/migrations/0007_media_user.py,sha256=aEcYEU12SaaPx8PDAzAqrOkkt8ArvV72iulWm-3zIJc,653 plugs_media/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 plugs_media/static/css/plugs_media.css,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 plugs_media/static/js/plugs_media.js,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 plugs_media/templates/plugs_media/base.html,sha256=zzaUPjEgvwxg-Gn2rZ6gIMWphucmEGvAU_skUXJIcDA,661 plugs_media-0.1.4.dist-info/DESCRIPTION.rst,sha256=CK1MtAZiIrwgTn9E6zA0m6TtmF-GbJq_3Lzg1Aq70dU,1403 plugs_media-0.1.4.dist-info/METADATA,sha256=U0ql8Pd8rrFDZPtyVPX3v1WAAbFrFZ22ZfT0XPO_7v8,2238 plugs_media-0.1.4.dist-info/RECORD,, plugs_media-0.1.4.dist-info/WHEEL,sha256=GrqQvamwgBV4nLoJe0vhYRSWzWsx7xjlt74FT0SWYfE,110 plugs_media-0.1.4.dist-info/metadata.json,sha256=V6w2O0X0vVFFVm6kUotnNEECsiM42XVmtDQPkhKtaqE,970 plugs_media-0.1.4.dist-info/top_level.txt,sha256=Xi9uruSyV4jO1yeVybREfM13MacSC2c2q7xXWI2Pe4U,12 PK HJRssplugs_media/views.pyPKo'Jg-  plugs_media/fields.pyPK HJD%plugs_media/serializers.pyPK HJ9 plugs_media/models.pyPK;'J#6ttplugs_media/apps.pyPK HJN6Eplugs_media/permissions.pyPK HJ##plugs_media/validators.pyPKHJ^xplugs_media/__init__.pyPK'J0plugs_media/widgets.pyPKo'Ju)plugs_media/exceptions.pyPK;'J!eplugs_media/urls.pyPK HJQT9plugs_media/settings.pyPK;'J&plugs_media/static/css/plugs_media.cssPK;'J$plugs_media/static/js/plugs_media.jsPK}*JkM16plugs_media/migrations/0003_auto_20170109_2240.pyPK}*J)$1plugs_media/migrations/0005_auto_20170109_2258.pyPK}*JJ1plugs_media/migrations/0004_auto_20170109_2246.pyPKo'J W1"plugs_media/migrations/0002_auto_20170107_1957.pyPKo'J">(plugs_media/migrations/__init__.pyPKo'JTgg&~(plugs_media/migrations/0001_initial.pyPK}*J|1)+plugs_media/migrations/0006_auto_20170109_2259.pyPK HJv).plugs_media/migrations/0007_media_user.pyPK;'J+Z1plugs_media/templates/plugs_media/base.htmlPK,HJ{{+84plugs_media-0.1.4.dist-info/DESCRIPTION.rstPK,HJ*p9t)9plugs_media-0.1.4.dist-info/metadata.jsonPK+HJB)P ) >plugs_media-0.1.4.dist-info/top_level.txtPK,HJndnn!`>plugs_media-0.1.4.dist-info/WHEELPK,HJ?$ ?plugs_media-0.1.4.dist-info/METADATAPK,HJJ'C " Hplugs_media-0.1.4.dist-info/RECORDPK VR