PK 0J.H plugs_contact/views.py""" Plugs Contact Views """ from django.conf import settings from rest_framework import permissions from plugs_core.viewsets import CreateViewSet from plugs_mail import utils from plugs_contact import serializers, models, emails from plugs_auth.utils import language_from_header # pylint: disable=R0901 class ContactViewSet(CreateViewSet): """ Contact Viewset """ queryset = models.Contact.objects.all() serializer_class = serializers.ContactSerializer permission_classes = [permissions.AllowAny] def get_language(self): try: accept_language_header = self.request.META['HTTP_ACCEPT_LANGUAGE'] return language_from_header(accept_language_header) except KeyError: return settings.LANGUAGE_CODE def perform_create(self, serializer): try: language = self.request.user.language except AttributeError: language = self.get_language() contact = serializer.save() data = {'contact': contact} payload = {'head': serializer.data.get('email'), 'body': serializer.data.get('message')} utils.to_staff(emails.ContactCreated, **data) utils.to_email(emails.ContactReceived, contact.email, language, **data) PK JIXSٗ plugs_contact/serializers.py""" Plugs Contact Serializers """ from rest_framework import serializers from plugs_contact import models class ContactSerializer(serializers.ModelSerializer): """ Contact Serializer """ # pylint: disable=R0903 class Meta: """ Metaclass definition """ model = models.Contact fields = ('id', 'email', 'subject', 'message', 'created', 'updated') PK JIZB plugs_contact/models.py""" Plugs Contact Models """ from django.db import models from django.utils.translation import ugettext_lazy as _ from plugs_core import mixins class Contact(mixins.Timestampable, models.Model): """ Contact Model """ email = models.EmailField() subject = models.CharField(max_length=75, null=True, blank=True) message = models.TextField() def __str__(self): return self.subject # pylint: disable=R0903 class Meta: """ Providing verbose names is recommended if we want to use i18n in admin site """ ordering = ('created', ) verbose_name = _('contact') verbose_name_plural = _('contacts') PK L0J plugs_contact/__init__.py__version__ = '0.1.2' PK JI%. plugs_contact/admin.pyfrom django.contrib import admin from plugs_contact.models import Contact class ContactAdmin(admin.ModelAdmin): """ Contact Model Admin """ fields = ('email', 'subject', 'message') readonly_fields = ('id', 'created', 'updated') list_display = ('email', 'subject', 'created') search_fields = ('email', 'subject') admin.site.register(Contact, ContactAdmin) PK -JX~p' ' plugs_contact/emails.py""" Email Template Definition """ from plugs_mail.mail import PlugsMail class ContactCreated(PlugsMail): """ Email sent to superusers notifying of new contact """ template = 'CONTACT_CREATED' context = ('Contact', ) description = 'Email sent to staff users notifying of new contact' class ContactReceived(PlugsMail): """ Email sent to user confirming the contact reception """ template = 'CONTACT_RECEIVED' context = ('Contact', ) description = 'Email sent to user confirming the contact reception' PK JIi; plugs_contact/runtests.py#!/usr/bin/env python import os import sys import django from django.conf import settings from django.test.utils import get_runner if __name__ == "__main__": os.environ['DJANGO_SETTINGS_MODULE'] = 'tests.test_settings' django.setup() TestRunner = get_runner(settings) test_runner = TestRunner() failures = test_runner.run_tests(["tests"]) sys.exit(bool(failures)) PK JIqHVE E $ plugs_contact/tests/test_settings.pySECRET_KEY = 'afakesecret' INSTALLED_APPS = [ "plugs_contact", ] PK IZ ! plugs_contact/tests/test_views.py""" Testing Views """ from django.core.urlresolvers import reverse from plugs_core.testcases import PlugsAPITestCase class TestsViews(PlugsAPITestCase): """ Testing Views """ def test_guest_can_create_contact(self): """ Ensures guest can create contact """ data = {'email': 'janedoe@example.com', 'subject': 'test 123', 'message': 'testing'} response = self.client.post(reverse('contact-list'), data) self.assert201(response) def test_methods_not_allowed(self): """ Ensures methods not allowed for contacts endpoint """ response = self.client.get(reverse('contact-list')) self.assert405(response) PK JI plugs_contact/tests/__init__.pyPK JI $ plugs_contact/migrations/__init__.pyPK JI#E ( plugs_contact/migrations/0001_initial.py# -*- coding: utf-8 -*- # Generated by Django 1.9.7 on 2016-12-22 22:37 from __future__ import unicode_literals from django.db import migrations, models class Migration(migrations.Migration): initial = True dependencies = [ ] operations = [ migrations.CreateModel( name='Contact', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('created', models.DateTimeField(auto_now_add=True)), ('updated', models.DateTimeField(auto_now=True)), ('email', models.EmailField(max_length=254)), ('subject', models.CharField(blank=True, max_length=75, null=True)), ('message', models.TextField()), ], options={ 'verbose_name_plural': 'contacts', 'verbose_name': 'contact', 'ordering': ('created',), }, ), ] PK -J? ? 7 plugs_contact/templates/emails/contact_received_pt.htmlRecebemos o pedido de informações. {% extends "base.html" %} {% block content %}
Olá,
Só para confirmar que recebemos o teu contato. Vamos responder muito em breve para o email {{contact.email}}.
Entretanto, para tua referência aqui fica o resumo:
{{contact.message}}
{% endblock %} PK -J&= 7 plugs_contact/templates/emails/contact_received_en.htmlWe've received your contact. {% extends "base.html" %} {% block content %}Hello,
{{contact.email}}.
{{contact.message}}
{% endblock %} PK -J^Bp 6 plugs_contact/templates/emails/contact_created_pt.htmlRecebemos novo contato. {% extends "base.html" %} {% block content %}Email: {{contact.email}}
Message: {{contact.message}}
Subject: {{contact.subject}}
{% endblock %} PK -J' 6 plugs_contact/templates/emails/contact_created_en.htmlWe received a new contact. {% extends "base.html" %} {% block content %}Email: {{contact.email}}
Message: {{contact.message}}
Subject: {{contact.subject}}
{% endblock %} PK S0Joa - plugs_contact-0.1.2.dist-info/DESCRIPTION.rst===== Plugs Contact ===== .. image:: https://badge.fury.io/py/plugs-contact.svg :target: https://badge.fury.io/py/plugs-contact Quick start ----------- Soon... History ------- 0.1.1 (2017-01-13) ++++++++++++++++++ * First release on PyPI. PK S0JJY + plugs_contact-0.1.2.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-contact"}}}, "extras": [], "generator": "bdist_wheel (0.26.0)", "keywords": ["plugs-contact"], "license": "MIT", "metadata_version": "2.0", "name": "plugs-contact", "run_requires": [{"requires": ["plugs-auth (>=0.1.5)", "plugs-core", "plugs-mail (>=0.1.5)"]}], "summary": "Your project description goes here", "version": "0.1.2"}PK S0Jo + plugs_contact-0.1.2.dist-info/top_level.txtplugs_contact PK S0Jndn n # plugs_contact-0.1.2.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 S0Jy_ _ &