PK~*J7yplugs_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_filter.decorators import auto_filters @auto_filters class MediaViewSet(viewsets.CreateReadViewSet): """ Media Endpoint, does not support update or delete operations """ queryset = models.Media.objects.all() serializer_class = serializers.MediaSerializer permission_classes = [permissions.IsAuthenticatedOrReadOnly] auto_filters_fields = ('content_type', 'object_id') @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}*Jplugs_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', 'created', 'updated') class MediaContentTypeSerializer(serializers.ModelSerializer): """ Media Serializer """ class Meta: model = ContentType fields = ('id', 'app_label', 'model') PK}*J_pq%%plugs_media/models.py""" Plugs media models """ 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') # 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' PKo'JGgplugs_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 # 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): try: Media.objects.get(file=value) except ObjectDoesNotExist: raise ValidationError(self.message, code=self.code) PK*J۴7plugs_media/__init__.py__version__ = '0.1.3' 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;'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;'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*J{{+plugs_media-0.1.3.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*Jfvq)plugs_media-0.1.3.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.3"}PK*JB)P )plugs_media-0.1.3.dist-info/top_level.txtplugs_media PK*Jndnn!plugs_media-0.1.3.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*JB:_;$plugs_media-0.1.3.dist-info/METADATAMetadata-Version: 2.0 Name: plugs-media Version: 0.1.3 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*Jq  "plugs_media-0.1.3.dist-info/RECORDplugs_media/__init__.py,sha256=uZsygMXMKRw-7qhWojAjnpm8GFPXU92xW6XA8O5GwFY,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=FiTc5ec29EITLDmAPBgIfNatYykHg2t6Os_Q9_RN2yA,805 plugs_media/serializers.py,sha256=q68onZmQ13DZa8OHICU_bX2RM8bI2R4ybJWS2B_VfzA,669 plugs_media/urls.py,sha256=0aE3OlS81ikQ8hbKC4E3xEkCVOgvWRCVmNy9TXLQg7w,210 plugs_media/validators.py,sha256=YFLefnquKTJ7l8EsK5dAg7UJqVsxjumZWE4KeUjAa7U,679 plugs_media/views.py,sha256=XoEgyg2h_llJ2pJkIR5IFXUKqDJ0EGg4sSXjDAjM37Y,1007 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/__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.3.dist-info/DESCRIPTION.rst,sha256=CK1MtAZiIrwgTn9E6zA0m6TtmF-GbJq_3Lzg1Aq70dU,1403 plugs_media-0.1.3.dist-info/METADATA,sha256=gm_qh97GgxQUPBnwy2Z6iuAI0lDHg81eTXQZt4XlQQ4,2238 plugs_media-0.1.3.dist-info/RECORD,, plugs_media-0.1.3.dist-info/WHEEL,sha256=GrqQvamwgBV4nLoJe0vhYRSWzWsx7xjlt74FT0SWYfE,110 plugs_media-0.1.3.dist-info/metadata.json,sha256=Zw8qIRcg9I5k4tB9sk1FjpChFYHtKIAWyYDRRqly-ao,970 plugs_media-0.1.3.dist-info/top_level.txt,sha256=Xi9uruSyV4jO1yeVybREfM13MacSC2c2q7xXWI2Pe4U,12 PK~*J7yplugs_media/views.pyPKo'Jg-  !plugs_media/fields.pyPK}*J^plugs_media/serializers.pyPK}*J_pq%%3 plugs_media/models.pyPK;'J#6tt plugs_media/apps.pyPKo'JGg0plugs_media/validators.pyPK*J۴7plugs_media/__init__.pyPK'JYplugs_media/widgets.pyPKo'Ju)<plugs_media/exceptions.pyPK;'J!eplugs_media/urls.pyPK;'J&plugs_media/static/css/plugs_media.cssPK;'J$?plugs_media/static/js/plugs_media.jsPK}*JkM1plugs_media/migrations/0003_auto_20170109_2240.pyPK}*J)$1plugs_media/migrations/0005_auto_20170109_2258.pyPK}*JJ1#plugs_media/migrations/0004_auto_20170109_2246.pyPKo'J W1Jplugs_media/migrations/0002_auto_20170107_1957.pyPKo'J"$plugs_media/migrations/__init__.pyPKo'JTgg&$plugs_media/migrations/0001_initial.pyPK}*J|1t'plugs_media/migrations/0006_auto_20170109_2259.pyPK;'J+*plugs_media/templates/plugs_media/base.htmlPK*J{{+-plugs_media-0.1.3.dist-info/DESCRIPTION.rstPK*Jfvq)s3plugs_media-0.1.3.dist-info/metadata.jsonPK*JB)P )7plugs_media-0.1.3.dist-info/top_level.txtPK*Jndnn!7plugs_media-0.1.3.dist-info/WHEELPK*JB:_;$8plugs_media-0.1.3.dist-info/METADATAPK*Jq  "Aplugs_media-0.1.3.dist-info/RECORDPKJ