Merge pull request #127 from 37soloist/feature/referer-field

Feature/referer field
This commit is contained in:
Isaac Bythewood
2018-08-21 12:10:28 -04:00
committed by GitHub
9 changed files with 72 additions and 11 deletions

View File

@@ -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

View 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),
),
]

View File

@@ -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)

View File

@@ -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

View File

@@ -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();
};

View File

@@ -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())
};

View File

@@ -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>

View File

@@ -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>

View File

@@ -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