mirror of
https://github.com/pinry/pinry.git
synced 2025-11-14 09:05:41 +01:00
Get basic working bookmarklet and refactor API into core
This commit is contained in:
@@ -1,126 +0,0 @@
|
|||||||
# pylint: disable-msg=R0904
|
|
||||||
# pylint: disable-msg=E1103
|
|
||||||
|
|
||||||
from django.test.client import Client
|
|
||||||
from django_images.models import Thumbnail
|
|
||||||
|
|
||||||
from taggit.models import Tag
|
|
||||||
from tastypie.test import ResourceTestCase
|
|
||||||
|
|
||||||
from ..pins.models import User, Pin, Image
|
|
||||||
|
|
||||||
|
|
||||||
def filter_generator_for(size):
|
|
||||||
def wrapped_func(obj):
|
|
||||||
return Thumbnail.objects.get_or_create_at_size(obj.pk, size)
|
|
||||||
return wrapped_func
|
|
||||||
|
|
||||||
|
|
||||||
class ImageResourceTest(ResourceTestCase):
|
|
||||||
fixtures = ['test_resources.json']
|
|
||||||
pass
|
|
||||||
|
|
||||||
def setUp(self):
|
|
||||||
super(ImageResourceTest, self).setUp()
|
|
||||||
self.client = Client()
|
|
||||||
|
|
||||||
def test_list_detail(self):
|
|
||||||
image = Image.objects.get(pk=1)
|
|
||||||
thumbnail = filter_generator_for('thumbnail')(image)
|
|
||||||
standard = filter_generator_for('standard')(image)
|
|
||||||
response = self.api_client.get('/api/v1/image/', format='json')
|
|
||||||
self.assertDictEqual(self.deserialize(response)['objects'][0], {
|
|
||||||
u'image': image.image.url,
|
|
||||||
u'height': image.height,
|
|
||||||
u'width': image.width,
|
|
||||||
u'standard': {
|
|
||||||
u'image': unicode(standard.image.url),
|
|
||||||
u'width': standard.width,
|
|
||||||
u'height': standard.height,
|
|
||||||
},
|
|
||||||
u'thumbnail': {
|
|
||||||
u'image': unicode(thumbnail.image.url),
|
|
||||||
u'width': thumbnail.width,
|
|
||||||
u'height': thumbnail.height,
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
|
|
||||||
class PinResourceTest(ResourceTestCase):
|
|
||||||
fixtures = ['test_resources.json']
|
|
||||||
|
|
||||||
def setUp(self):
|
|
||||||
super(PinResourceTest, self).setUp()
|
|
||||||
|
|
||||||
self.pin_1 = Pin.objects.get(pk=1)
|
|
||||||
self.image_url = 'http://technicallyphilly.com/wp-content/uploads/2013/02/url1.jpeg'
|
|
||||||
|
|
||||||
self.user = User.objects.get(pk=1)
|
|
||||||
self.api_client.client.login(username=self.user.username, password='password')
|
|
||||||
|
|
||||||
def test_post_create_url(self):
|
|
||||||
post_data = {
|
|
||||||
'submitter': '/api/v1/user/1/',
|
|
||||||
'url': self.image_url,
|
|
||||||
'description': 'That\'s an Apple!'
|
|
||||||
}
|
|
||||||
response = self.api_client.post('/api/v1/pin/', data=post_data)
|
|
||||||
self.assertHttpCreated(response)
|
|
||||||
self.assertEqual(Pin.objects.count(), 3)
|
|
||||||
self.assertEqual(Image.objects.count(), 3)
|
|
||||||
|
|
||||||
def test_post_create_obj(self):
|
|
||||||
user = User.objects.get(pk=1)
|
|
||||||
image = Image.objects.get(pk=1)
|
|
||||||
post_data = {
|
|
||||||
'submitter': '/api/v1/user/{}/'.format(user.pk),
|
|
||||||
'image': '/api/v1/image/{}/'.format(image.pk),
|
|
||||||
'description': 'That\'s something else (probably a CC logo)!',
|
|
||||||
'tags': ['random', 'tags'],
|
|
||||||
}
|
|
||||||
response = self.api_client.post('/api/v1/pin/', data=post_data)
|
|
||||||
self.assertEqual(self.deserialize(response)['id'], 3)
|
|
||||||
self.assertHttpCreated(response)
|
|
||||||
# A number of Image objects should stay the same as we are using an existing image
|
|
||||||
self.assertEqual(Image.objects.count(), 2)
|
|
||||||
self.assertEqual(Pin.objects.count(), 3)
|
|
||||||
self.assertEquals(Tag.objects.count(), 4)
|
|
||||||
|
|
||||||
def test_get_list_json_ordered(self):
|
|
||||||
pin = Pin.objects.latest('id')
|
|
||||||
response = self.api_client.get('/api/v1/pin/', format='json', data={'order_by': '-id'})
|
|
||||||
self.assertValidJSONResponse(response)
|
|
||||||
self.assertEqual(self.deserialize(response)['objects'][0]['id'], pin.id)
|
|
||||||
|
|
||||||
def test_get_list_json(self):
|
|
||||||
user = User.objects.get(pk=1)
|
|
||||||
image = Image.objects.get(pk=1)
|
|
||||||
standard = filter_generator_for('standard')(image)
|
|
||||||
thumbnail = filter_generator_for('thumbnail')(image)
|
|
||||||
response = self.api_client.get('/api/v1/pin/', format='json')
|
|
||||||
self.assertValidJSONResponse(response)
|
|
||||||
self.assertDictEqual(self.deserialize(response)['objects'][0], {
|
|
||||||
u'id': self.pin_1.id,
|
|
||||||
u'submitter': {
|
|
||||||
u'username': user.username,
|
|
||||||
u'gravatar': user.gravatar
|
|
||||||
},
|
|
||||||
u'image': {
|
|
||||||
u'image': unicode(image.image.url),
|
|
||||||
u'width': image.width,
|
|
||||||
u'height': image.height,
|
|
||||||
u'standard': {
|
|
||||||
u'image': unicode(standard.image.url),
|
|
||||||
u'width': standard.width,
|
|
||||||
u'height': standard.height,
|
|
||||||
},
|
|
||||||
u'thumbnail': {
|
|
||||||
u'image': unicode(thumbnail.image.url),
|
|
||||||
u'width': thumbnail.width,
|
|
||||||
u'height': thumbnail.height,
|
|
||||||
}
|
|
||||||
},
|
|
||||||
u'url': self.pin_1.url,
|
|
||||||
u'description': self.pin_1.description,
|
|
||||||
u'tags': [u'creative-commons'],
|
|
||||||
})
|
|
||||||
@@ -1,17 +0,0 @@
|
|||||||
from django.conf.urls import patterns, include, url
|
|
||||||
|
|
||||||
from tastypie.api import Api
|
|
||||||
|
|
||||||
from .api import ImageResource, ThumbnailResource, PinResource, UserResource
|
|
||||||
|
|
||||||
|
|
||||||
v1_api = Api(api_name='v1')
|
|
||||||
v1_api.register(ImageResource())
|
|
||||||
v1_api.register(ThumbnailResource())
|
|
||||||
v1_api.register(PinResource())
|
|
||||||
v1_api.register(UserResource())
|
|
||||||
|
|
||||||
|
|
||||||
urlpatterns = patterns('',
|
|
||||||
url(r'^api/', include(v1_api.urls)),
|
|
||||||
)
|
|
||||||
@@ -1,83 +1,126 @@
|
|||||||
from django.utils import unittest
|
# pylint: disable-msg=R0904
|
||||||
|
# pylint: disable-msg=E1103
|
||||||
|
|
||||||
from django.test.client import Client
|
from django.test.client import Client
|
||||||
from django.core.urlresolvers import reverse
|
from django_images.models import Thumbnail
|
||||||
|
|
||||||
|
from taggit.models import Tag
|
||||||
|
from tastypie.test import ResourceTestCase
|
||||||
|
|
||||||
|
from ..pins.models import User, Pin, Image
|
||||||
|
|
||||||
|
|
||||||
class HomeTest(unittest.TestCase):
|
def filter_generator_for(size):
|
||||||
|
def wrapped_func(obj):
|
||||||
|
return Thumbnail.objects.get_or_create_at_size(obj.pk, size)
|
||||||
|
return wrapped_func
|
||||||
|
|
||||||
|
|
||||||
|
class ImageResourceTest(ResourceTestCase):
|
||||||
|
fixtures = ['test_resources.json']
|
||||||
|
pass
|
||||||
|
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
|
super(ImageResourceTest, self).setUp()
|
||||||
self.client = Client()
|
self.client = Client()
|
||||||
self.url = reverse('core:home')
|
|
||||||
|
|
||||||
def test_url(self):
|
def test_list_detail(self):
|
||||||
self.assertEqual(self.url, '/')
|
image = Image.objects.get(pk=1)
|
||||||
|
thumbnail = filter_generator_for('thumbnail')(image)
|
||||||
def test_status_code(self):
|
standard = filter_generator_for('standard')(image)
|
||||||
response = self.client.get(self.url)
|
response = self.api_client.get('/api/v1/image/', format='json')
|
||||||
self.assertEqual(response.status_code, 302)
|
self.assertDictEqual(self.deserialize(response)['objects'][0], {
|
||||||
|
u'image': image.image.url,
|
||||||
|
u'height': image.height,
|
||||||
class RegisterTest(unittest.TestCase):
|
u'width': image.width,
|
||||||
def setUp(self):
|
u'standard': {
|
||||||
self.client = Client()
|
u'image': unicode(standard.image.url),
|
||||||
self.url = reverse('core:register')
|
u'width': standard.width,
|
||||||
|
u'height': standard.height,
|
||||||
def test_url(self):
|
},
|
||||||
self.assertEqual(self.url, '/register/')
|
u'thumbnail': {
|
||||||
|
u'image': unicode(thumbnail.image.url),
|
||||||
def test_status_code(self):
|
u'width': thumbnail.width,
|
||||||
response = self.client.get(self.url)
|
u'height': thumbnail.height,
|
||||||
self.assertEqual(response.status_code, 200)
|
}
|
||||||
|
|
||||||
@unittest.expectedFailure
|
|
||||||
def test_successful_registration(self):
|
|
||||||
# If 302 was success, if 200 same page registration failed.
|
|
||||||
response = self.client.post(self.url, {
|
|
||||||
'username': 'test_registration_success',
|
|
||||||
'password1': 'test_password',
|
|
||||||
'password2': 'test_password',
|
|
||||||
})
|
|
||||||
self.assertEqual(response.status_code, 302)
|
|
||||||
|
|
||||||
def test_failed_registration(self):
|
|
||||||
# If 302 was success, if 200 same page registration failed.
|
|
||||||
response = self.client.post(self.url, {
|
|
||||||
'username': 'test_registration_failed',
|
|
||||||
'password1': 'test_password',
|
|
||||||
'password2': 'test_wrong_password',
|
|
||||||
})
|
|
||||||
self.assertEqual(response.status_code, 200)
|
|
||||||
|
|
||||||
|
|
||||||
class LoginTest(unittest.TestCase):
|
|
||||||
def setUp(self):
|
|
||||||
self.client = Client()
|
|
||||||
self.url = reverse('core:login')
|
|
||||||
|
|
||||||
def test_url(self):
|
|
||||||
self.assertEqual(self.url, '/login/')
|
|
||||||
|
|
||||||
def test_status_code(self):
|
|
||||||
response = self.client.get(self.url)
|
|
||||||
self.assertEqual(response.status_code, 200)
|
|
||||||
|
|
||||||
|
|
||||||
class LogoutTest(unittest.TestCase):
|
|
||||||
def setUp(self):
|
|
||||||
self.client = Client()
|
|
||||||
self.url = reverse('core:logout')
|
|
||||||
self.client.post(self.url, {
|
|
||||||
'username': 'test_user_logout',
|
|
||||||
'password1': 'test_password',
|
|
||||||
'password2': 'test_password',
|
|
||||||
})
|
})
|
||||||
|
|
||||||
def test_url(self):
|
|
||||||
self.assertEqual(self.url, '/logout/')
|
|
||||||
|
|
||||||
def test_logout_with_logged_in_user(self):
|
class PinResourceTest(ResourceTestCase):
|
||||||
self.client.post(self.url, {
|
fixtures = ['test_resources.json']
|
||||||
'username': 'test_user_logout',
|
|
||||||
'password': 'test_password'
|
def setUp(self):
|
||||||
|
super(PinResourceTest, self).setUp()
|
||||||
|
|
||||||
|
self.pin_1 = Pin.objects.get(pk=1)
|
||||||
|
self.image_url = 'http://technicallyphilly.com/wp-content/uploads/2013/02/url1.jpeg'
|
||||||
|
|
||||||
|
self.user = User.objects.get(pk=1)
|
||||||
|
self.api_client.client.login(username=self.user.username, password='password')
|
||||||
|
|
||||||
|
def test_post_create_url(self):
|
||||||
|
post_data = {
|
||||||
|
'submitter': '/api/v1/user/1/',
|
||||||
|
'url': self.image_url,
|
||||||
|
'description': 'That\'s an Apple!'
|
||||||
|
}
|
||||||
|
response = self.api_client.post('/api/v1/pin/', data=post_data)
|
||||||
|
self.assertHttpCreated(response)
|
||||||
|
self.assertEqual(Pin.objects.count(), 3)
|
||||||
|
self.assertEqual(Image.objects.count(), 3)
|
||||||
|
|
||||||
|
def test_post_create_obj(self):
|
||||||
|
user = User.objects.get(pk=1)
|
||||||
|
image = Image.objects.get(pk=1)
|
||||||
|
post_data = {
|
||||||
|
'submitter': '/api/v1/user/{}/'.format(user.pk),
|
||||||
|
'image': '/api/v1/image/{}/'.format(image.pk),
|
||||||
|
'description': 'That\'s something else (probably a CC logo)!',
|
||||||
|
'tags': ['random', 'tags'],
|
||||||
|
}
|
||||||
|
response = self.api_client.post('/api/v1/pin/', data=post_data)
|
||||||
|
self.assertEqual(self.deserialize(response)['id'], 3)
|
||||||
|
self.assertHttpCreated(response)
|
||||||
|
# A number of Image objects should stay the same as we are using an existing image
|
||||||
|
self.assertEqual(Image.objects.count(), 2)
|
||||||
|
self.assertEqual(Pin.objects.count(), 3)
|
||||||
|
self.assertEquals(Tag.objects.count(), 4)
|
||||||
|
|
||||||
|
def test_get_list_json_ordered(self):
|
||||||
|
pin = Pin.objects.latest('id')
|
||||||
|
response = self.api_client.get('/api/v1/pin/', format='json', data={'order_by': '-id'})
|
||||||
|
self.assertValidJSONResponse(response)
|
||||||
|
self.assertEqual(self.deserialize(response)['objects'][0]['id'], pin.id)
|
||||||
|
|
||||||
|
def test_get_list_json(self):
|
||||||
|
user = User.objects.get(pk=1)
|
||||||
|
image = Image.objects.get(pk=1)
|
||||||
|
standard = filter_generator_for('standard')(image)
|
||||||
|
thumbnail = filter_generator_for('thumbnail')(image)
|
||||||
|
response = self.api_client.get('/api/v1/pin/', format='json')
|
||||||
|
self.assertValidJSONResponse(response)
|
||||||
|
self.assertDictEqual(self.deserialize(response)['objects'][0], {
|
||||||
|
u'id': self.pin_1.id,
|
||||||
|
u'submitter': {
|
||||||
|
u'username': user.username,
|
||||||
|
u'gravatar': user.gravatar
|
||||||
|
},
|
||||||
|
u'image': {
|
||||||
|
u'image': unicode(image.image.url),
|
||||||
|
u'width': image.width,
|
||||||
|
u'height': image.height,
|
||||||
|
u'standard': {
|
||||||
|
u'image': unicode(standard.image.url),
|
||||||
|
u'width': standard.width,
|
||||||
|
u'height': standard.height,
|
||||||
|
},
|
||||||
|
u'thumbnail': {
|
||||||
|
u'image': unicode(thumbnail.image.url),
|
||||||
|
u'width': thumbnail.width,
|
||||||
|
u'height': thumbnail.height,
|
||||||
|
}
|
||||||
|
},
|
||||||
|
u'url': self.pin_1.url,
|
||||||
|
u'description': self.pin_1.description,
|
||||||
|
u'tags': [u'creative-commons'],
|
||||||
})
|
})
|
||||||
response = self.client.get(self.url)
|
|
||||||
self.assertEqual(response.status_code, 302)
|
|
||||||
|
|||||||
@@ -1,11 +1,29 @@
|
|||||||
from django.conf.urls import patterns, url
|
from django.conf.urls import patterns, include, url
|
||||||
|
|
||||||
|
from tastypie.api import Api
|
||||||
|
|
||||||
|
from .api import ImageResource, ThumbnailResource, PinResource, UserResource
|
||||||
|
|
||||||
|
|
||||||
|
v1_api = Api(api_name='v1')
|
||||||
|
v1_api.register(ImageResource())
|
||||||
|
v1_api.register(ThumbnailResource())
|
||||||
|
v1_api.register(PinResource())
|
||||||
|
v1_api.register(UserResource())
|
||||||
|
|
||||||
|
|
||||||
urlpatterns = patterns('',
|
urlpatterns = patterns('',
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
urlpatterns = patterns('',
|
||||||
|
url(r'^api/', include(v1_api.urls, namespace='api')),
|
||||||
|
|
||||||
url(r'^$', 'pinry.core.views.home', name='home'),
|
url(r'^$', 'pinry.core.views.home', name='home'),
|
||||||
|
|
||||||
url(r'^private/$', 'pinry.core.views.private', name='private'),
|
url(r'^private/$', 'pinry.core.views.private', name='private'),
|
||||||
url(r'^login/$', 'django.contrib.auth.views.login',
|
url(r'^login/$', 'django.contrib.auth.views.login',
|
||||||
{'template_name': 'user/login.html'}, name='login'),
|
{'template_name': 'user/login.html'}, name='login'),
|
||||||
url(r'^register/$', 'pinry.core.views.register', name='register'),
|
|
||||||
url(r'^logout/$', 'pinry.core.views.logout_user', name='logout'),
|
url(r'^logout/$', 'pinry.core.views.logout_user', name='logout'),
|
||||||
|
url(r'^register/$', 'pinry.core.views.register', name='register'),
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -5,9 +5,11 @@ from .views import CreateImage
|
|||||||
|
|
||||||
|
|
||||||
urlpatterns = patterns('pinry.pins.views',
|
urlpatterns = patterns('pinry.pins.views',
|
||||||
|
url(r'^pin-form/$', TemplateView.as_view(template_name='core/pin_form.html'),
|
||||||
|
name='pin-form'),
|
||||||
url(r'^upload-pin/$', CreateImage.as_view(), name='new-pin'),
|
url(r'^upload-pin/$', CreateImage.as_view(), name='new-pin'),
|
||||||
url(r'^$', TemplateView.as_view(template_name='core/pins.html'),
|
|
||||||
name='recent-pins'),
|
|
||||||
url(r'^tag/(?P<tag>(\w|-)+)/$', TemplateView.as_view(template_name='core/pins.html'),
|
url(r'^tag/(?P<tag>(\w|-)+)/$', TemplateView.as_view(template_name='core/pins.html'),
|
||||||
name='tag-pins'),
|
name='tag-pins'),
|
||||||
|
url(r'^$', TemplateView.as_view(template_name='core/pins.html'),
|
||||||
|
name='recent-pins'),
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -86,7 +86,6 @@ INSTALLED_APPS = (
|
|||||||
'django_images',
|
'django_images',
|
||||||
'pinry.core',
|
'pinry.core',
|
||||||
'pinry.pins',
|
'pinry.pins',
|
||||||
'pinry.api',
|
|
||||||
)
|
)
|
||||||
|
|
||||||
IMAGE_SIZES = {
|
IMAGE_SIZES = {
|
||||||
|
|||||||
@@ -6,6 +6,21 @@ if (!jQuery) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
$(document).ready(function() {
|
$(document).ready(function() {
|
||||||
|
var scriptUri;
|
||||||
|
|
||||||
|
function curScriptUrl(callback) {
|
||||||
|
var scripts = document.getElementsByTagName("script");
|
||||||
|
var scriptURI = scripts[scripts.length-1].src;
|
||||||
|
|
||||||
|
if(scriptURI != "") {
|
||||||
|
callback(scriptURI);
|
||||||
|
} else if($ != undefined) {
|
||||||
|
$(document).ajaxSuccess(function(e, xhr, s) {
|
||||||
|
callback(s.url);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
function createPage() {
|
function createPage() {
|
||||||
var documentHeight = $(document).height();
|
var documentHeight = $(document).height();
|
||||||
|
|
||||||
@@ -37,14 +52,13 @@ $(document).ready(function() {
|
|||||||
'cursor': 'pointer'
|
'cursor': 'pointer'
|
||||||
});
|
});
|
||||||
wrapper.click(function() {
|
wrapper.click(function() {
|
||||||
$.ajax({
|
var apiUrl = 'http://';
|
||||||
type: "post",
|
curScriptUrl(function(x) {
|
||||||
url: "http://nebula.bythewood.me/api/v1/pin/",
|
scriptUri = x;
|
||||||
contentType: 'application/json',
|
apiUrl = apiUrl +scriptUri.split('/')[2];
|
||||||
data: JSON.stringify({
|
|
||||||
url: imageUrl
|
|
||||||
})
|
|
||||||
});
|
});
|
||||||
|
apiUrl = apiUrl + '/pins/pin-form/?pin-image-url='+imageUrl;
|
||||||
|
window.open(apiUrl, '1361920530821', 'width=579,height=475,toolbar=0,menubar=0,location=0,status=1,scrollbars=1,resizable=1,left=0,top=0');
|
||||||
$('.pinry-images').remove();
|
$('.pinry-images').remove();
|
||||||
});
|
});
|
||||||
return wrapper;
|
return wrapper;
|
||||||
|
|||||||
@@ -51,6 +51,17 @@ $(window).load(function() {
|
|||||||
$('#pin-form-tags').bind('propertychange keyup input paste', function() {
|
$('#pin-form-tags').bind('propertychange keyup input paste', function() {
|
||||||
createPreview();
|
createPreview();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
function getURLParameter(name) {
|
||||||
|
return decodeURI(
|
||||||
|
(RegExp(name + '=' + '(.+?)(&|$)').exec(location.search)||[,null])[1]
|
||||||
|
);
|
||||||
|
}
|
||||||
|
if (getURLParameter('pin-image-url') != 'null') {
|
||||||
|
$('#pin-form-image-url').val(getURLParameter('pin-image-url'));
|
||||||
|
createPreview();
|
||||||
|
}
|
||||||
|
|
||||||
$('#pin-form-submit').click(function(e) {
|
$('#pin-form-submit').click(function(e) {
|
||||||
var tags = cleanTags();
|
var tags = cleanTags();
|
||||||
$.ajax({
|
$.ajax({
|
||||||
@@ -85,6 +96,8 @@ $(window).load(function() {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ($('#display-pin-form').length >= 1) createPinForm();
|
||||||
|
|
||||||
$('#call-pin-form').click(function() {
|
$('#call-pin-form').click(function() {
|
||||||
createPinForm();
|
createPinForm();
|
||||||
});
|
});
|
||||||
|
|||||||
7
pinry/templates/core/pin_form.html
Normal file
7
pinry/templates/core/pin_form.html
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
{% extends "base.html" %}
|
||||||
|
|
||||||
|
{% block title %}Pin Form{% endblock %}
|
||||||
|
|
||||||
|
{% block yield %}
|
||||||
|
<div id="display-pin-form"></div>
|
||||||
|
{% endblock %}
|
||||||
@@ -5,6 +5,5 @@ from django.conf import settings
|
|||||||
|
|
||||||
urlpatterns = patterns('',
|
urlpatterns = patterns('',
|
||||||
url(r'^pins/', include('pinry.pins.urls', namespace='pins')),
|
url(r'^pins/', include('pinry.pins.urls', namespace='pins')),
|
||||||
url(r'', include('pinry.api.urls')),
|
|
||||||
url(r'', include('pinry.core.urls', namespace='core')),
|
url(r'', include('pinry.core.urls', namespace='core')),
|
||||||
) + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
|
) + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
|
||||||
|
|||||||
Reference in New Issue
Block a user