mirror of
https://github.com/pinry/pinry.git
synced 2026-01-13 18:52:07 +01:00
Merge pull request #127 from 37soloist/feature/referer-field
Feature/referer field
This commit is contained in:
@@ -103,7 +103,10 @@ class PinResource(ModelResource):
|
||||
def hydrate_image(self, bundle):
|
||||
url = bundle.data.get('url', None)
|
||||
if url:
|
||||
image = Image.objects.create_for_url(url)
|
||||
image = Image.objects.create_for_url(
|
||||
url,
|
||||
referer=bundle.data.get('referer', None),
|
||||
)
|
||||
bundle.data['image'] = '/api/v1/image/{}/'.format(image.pk)
|
||||
return bundle
|
||||
|
||||
@@ -137,7 +140,7 @@ class PinResource(ModelResource):
|
||||
return super(PinResource, self).save_m2m(bundle)
|
||||
|
||||
class Meta:
|
||||
fields = ['id', 'url', 'origin', 'description']
|
||||
fields = ['id', 'url', 'origin', 'description', 'referer']
|
||||
ordering = ['id']
|
||||
filtering = {
|
||||
'submitter': ALL_WITH_RELATIONS
|
||||
|
||||
19
core/migrations/0002_pin_referer.py
Normal file
19
core/migrations/0002_pin_referer.py
Normal file
@@ -0,0 +1,19 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
from __future__ import unicode_literals
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('core', '0001_initial'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name='pin',
|
||||
name='referer',
|
||||
field=models.URLField(null=True),
|
||||
),
|
||||
]
|
||||
@@ -14,11 +14,20 @@ from users.models import User
|
||||
|
||||
|
||||
class ImageManager(models.Manager):
|
||||
_default_ua = {
|
||||
'User-Agent': 'Mozilla/5.0 (Windows NT 5.1) '
|
||||
'AppleWebKit/537.36 (KHTML, like Gecko) '
|
||||
'Chrome/48.0.2564.82 Safari/537.36',
|
||||
}
|
||||
|
||||
# FIXME: Move this into an asynchronous task
|
||||
def create_for_url(self, url):
|
||||
def create_for_url(self, url, referer=None):
|
||||
file_name = url.split("/")[-1].split('#')[0].split('?')[0]
|
||||
buf = BytesIO()
|
||||
response = requests.get(url)
|
||||
headers = dict(self._default_ua)
|
||||
if referer is not None:
|
||||
headers["Referer"] = referer
|
||||
response = requests.get(url, headers=headers)
|
||||
buf.write(response.content)
|
||||
obj = InMemoryUploadedFile(buf, 'image', file_name,
|
||||
None, buf.tell(), None)
|
||||
@@ -42,6 +51,7 @@ class Pin(models.Model):
|
||||
submitter = models.ForeignKey(User)
|
||||
url = models.URLField(null=True)
|
||||
origin = models.URLField(null=True)
|
||||
referer = models.URLField(null=True)
|
||||
description = models.TextField(blank=True, null=True)
|
||||
image = models.ForeignKey(Image, related_name='pin')
|
||||
published = models.DateTimeField(auto_now_add=True)
|
||||
|
||||
@@ -67,9 +67,11 @@ class PinResourceTest(ResourceTestCase):
|
||||
@mock.patch('requests.get', mock_requests_get)
|
||||
def test_post_create_url(self):
|
||||
url = 'http://testserver/mocked/logo.png'
|
||||
referer = 'http://testserver/'
|
||||
post_data = {
|
||||
'submitter': '/api/v1/user/{}/'.format(self.user.pk),
|
||||
'url': url,
|
||||
'referer': referer,
|
||||
'description': 'That\'s an Apple!'
|
||||
}
|
||||
response = self.api_client.post('/api/v1/pin/', data=post_data)
|
||||
@@ -89,9 +91,11 @@ class PinResourceTest(ResourceTestCase):
|
||||
@mock.patch('requests.get', mock_requests_get)
|
||||
def test_post_create_url_with_empty_tags(self):
|
||||
url = 'http://testserver/mocked/logo.png'
|
||||
referer = 'http://testserver/'
|
||||
post_data = {
|
||||
'submitter': '/api/v1/user/{}/'.format(self.user.pk),
|
||||
'url': url,
|
||||
'referer': referer,
|
||||
'description': 'That\'s an Apple!',
|
||||
'tags': []
|
||||
}
|
||||
@@ -105,9 +109,11 @@ class PinResourceTest(ResourceTestCase):
|
||||
@mock.patch('requests.get', mock_requests_get)
|
||||
def test_post_create_url_unauthorized(self):
|
||||
url = 'http://testserver/mocked/logo.png'
|
||||
referer = 'http://testserver/'
|
||||
post_data = {
|
||||
'submitter': '/api/v1/user/2/',
|
||||
'url': url,
|
||||
'referer': referer,
|
||||
'description': 'That\'s an Apple!',
|
||||
'tags': []
|
||||
}
|
||||
@@ -119,9 +125,11 @@ class PinResourceTest(ResourceTestCase):
|
||||
@mock.patch('requests.get', mock_requests_get)
|
||||
def test_post_create_url_with_empty_origin(self):
|
||||
url = 'http://testserver/mocked/logo.png'
|
||||
referer = 'http://testserver/'
|
||||
post_data = {
|
||||
'submitter': '/api/v1/user/{}/'.format(self.user.pk),
|
||||
'url': url,
|
||||
'referer': referer,
|
||||
'description': 'That\'s an Apple!',
|
||||
'origin': None
|
||||
}
|
||||
@@ -135,9 +143,11 @@ class PinResourceTest(ResourceTestCase):
|
||||
def test_post_create_url_with_origin(self):
|
||||
origin = 'http://testserver/mocked/'
|
||||
url = origin + 'logo.png'
|
||||
referer = 'http://testserver/'
|
||||
post_data = {
|
||||
'submitter': '/api/v1/user/{}/'.format(self.user.pk),
|
||||
'url': url,
|
||||
'referer': referer,
|
||||
'description': 'That\'s an Apple!',
|
||||
'origin': origin
|
||||
}
|
||||
@@ -149,8 +159,10 @@ class PinResourceTest(ResourceTestCase):
|
||||
|
||||
def test_post_create_obj(self):
|
||||
image = ImageFactory()
|
||||
referer = 'http://testserver/'
|
||||
post_data = {
|
||||
'submitter': '/api/v1/user/{}/'.format(self.user.pk),
|
||||
'referer': referer,
|
||||
'image': '/api/v1/image/{}/'.format(image.pk),
|
||||
'description': 'That\'s something else (probably a CC logo)!',
|
||||
'tags': ['random', 'tags'],
|
||||
@@ -228,6 +240,7 @@ class PinResourceTest(ResourceTestCase):
|
||||
pin = PinFactory(**{
|
||||
'submitter': self.user,
|
||||
'image': image,
|
||||
'referer': 'http://testserver/mocked/',
|
||||
'url': 'http://testserver/mocked/logo.png',
|
||||
'description': u'Mocked Description',
|
||||
'origin': None
|
||||
|
||||
@@ -92,7 +92,8 @@
|
||||
border: '1px solid #555'
|
||||
});
|
||||
image.onclick = function() {
|
||||
var popUrl = getFormUrl()+encodeURIComponent(imageUrl);
|
||||
var popUrl = getFormUrl() + encodeURIComponent(imageUrl);
|
||||
popUrl = popUrl + '&referer=' + encodeURIComponent(window.location);
|
||||
window.open(popUrl);
|
||||
closePinry();
|
||||
};
|
||||
|
||||
@@ -17,6 +17,7 @@ $(window).load(function() {
|
||||
return {
|
||||
submitter: currentUser,
|
||||
url: $('#pin-form-image-url').val(),
|
||||
referer: $('#pin-form-referer').val(),
|
||||
description: $('#pin-form-description').val(),
|
||||
tags: cleanTags($('#pin-form-tags').val())
|
||||
}
|
||||
@@ -26,6 +27,7 @@ $(window).load(function() {
|
||||
var context = {pins: [{
|
||||
submitter: currentUser,
|
||||
image: {thumbnail: {image: $('#pin-form-image-url').val()}},
|
||||
referer: $('#pin-form-referer').val(),
|
||||
description: $('#pin-form-description').val(),
|
||||
tags: cleanTags($('#pin-form-tags').val())
|
||||
}]},
|
||||
@@ -59,9 +61,14 @@ $(window).load(function() {
|
||||
function createPinForm(editPinId) {
|
||||
$('body').append(renderTemplate('#pin-form-template', ''));
|
||||
var modal = $('#pin-form'),
|
||||
formFields = [$('#pin-form-image-url'), $('#pin-form-description'),
|
||||
$('#pin-form-tags')],
|
||||
pinFromUrl = getUrlParameter('pin-image-url');
|
||||
formFields = [
|
||||
$('#pin-form-image-url'),
|
||||
$('#pin-form-referer'),
|
||||
$('#pin-form-description'),
|
||||
$('#pin-form-tags')
|
||||
],
|
||||
pinFromUrl = getUrlParameter('pin-image-url'),
|
||||
pinFromReferer = getUrlParameter('referer');
|
||||
// If editable grab existing data
|
||||
if (editPinId) {
|
||||
var promise = getPinData(editPinId);
|
||||
@@ -69,6 +76,7 @@ $(window).load(function() {
|
||||
editedPin = data;
|
||||
$('#pin-form-image-url').val(editedPin.image.thumbnail.image);
|
||||
$('#pin-form-image-url').parent().hide();
|
||||
$('#pin-form-referer').parent().hide();
|
||||
$('#pin-form-image-upload').parent().hide();
|
||||
$('#pin-form-description').val(editedPin.description);
|
||||
$('#pin-form-tags').val(editedPin.tags);
|
||||
@@ -113,6 +121,7 @@ $(window).load(function() {
|
||||
if (pinFromUrl) {
|
||||
$('#pin-form-image-upload').parent().css('display', 'none');
|
||||
$('#pin-form-image-url').val(pinFromUrl);
|
||||
$('#pin-form-referer').val(pinFromReferer);
|
||||
$('.navbar').css('display', 'none');
|
||||
modal.css({
|
||||
'margin-top': -35,
|
||||
@@ -155,6 +164,7 @@ $(window).load(function() {
|
||||
} else {
|
||||
var data = {
|
||||
submitter: '/api/v1/user/'+currentUser.id+'/',
|
||||
referer: $('#pin-form-referer').val(),
|
||||
description: $('#pin-form-description').val(),
|
||||
tags: cleanTags($('#pin-form-tags').val())
|
||||
};
|
||||
|
||||
@@ -24,8 +24,9 @@
|
||||
{{/if}}
|
||||
</div>
|
||||
<div class="text extra pull-right">
|
||||
<a href="{{url}}" class="btn btn-sm btn-default btn-warning">Original URL</a>
|
||||
<a href="/{{id}}/" class="btn btn-sm btn-default btn-success">Pin URL</a>
|
||||
<a href="{{referer}}" class="btn btn-sm btn-default btn-warning" target="_blank">Referer</a>
|
||||
<a href="{{url}}" class="btn btn-sm btn-default btn-primary" target="_blank">Original URL</a>
|
||||
<a href="/{{id}}/" class="btn btn-sm btn-default btn-success" target="_blank">Pin URL</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -17,6 +17,10 @@
|
||||
<label for="pin-form-image-upload">Image Upload</label>
|
||||
<form action="/pins/create-image/" id="pin-form-image-upload" class="dropzone"></form>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="pin-form-referer">Referer</label>
|
||||
<input name="pin-form-referer" id="pin-form-referer" class="form-control" type="text"/>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="pin-form-description">Description</label>
|
||||
<textarea name="pin-form-description" id="pin-form-description" class="form-control"></textarea>
|
||||
|
||||
@@ -9,7 +9,7 @@ from core.models import Image, Pin
|
||||
from .models import User
|
||||
|
||||
|
||||
def mock_requests_get(url):
|
||||
def mock_requests_get(url, headers=None):
|
||||
response = mock.Mock(content=open('logo.png', 'rb').read())
|
||||
return response
|
||||
|
||||
|
||||
Reference in New Issue
Block a user