Skip to content

Commit

Permalink
Shortening working
Browse files Browse the repository at this point in the history
  • Loading branch information
heynemann committed Jul 31, 2011
1 parent ab8a541 commit 10ded9b
Show file tree
Hide file tree
Showing 9 changed files with 126 additions and 17 deletions.
3 changes: 2 additions & 1 deletion Makefile
Expand Up @@ -35,4 +35,5 @@ test:
jstest: jstest:
@jasmine-splinter `pwd`/jstests/index.html @jasmine-splinter `pwd`/jstests/index.html



update_schema:
@cd myimgat/ && python manage.py schemamigration wall --auto
@@ -0,0 +1,93 @@
# encoding: utf-8
import datetime
from south.db import db
from south.v2 import SchemaMigration
from django.db import models

class Migration(SchemaMigration):

def forwards(self, orm):

# Adding field 'CroppedPhoto.hash'
db.add_column('wall_croppedphoto', 'hash', self.gf('django.db.models.fields.CharField')(max_length=200, null=True, db_index=True), keep_default=False)


def backwards(self, orm):

# Deleting field 'CroppedPhoto.hash'
db.delete_column('wall_croppedphoto', 'hash')


models = {
'auth.group': {
'Meta': {'object_name': 'Group'},
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}),
'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'})
},
'auth.permission': {
'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'},
'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
},
'auth.user': {
'Meta': {'object_name': 'User'},
'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}),
'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}),
'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'})
},
'contenttypes.contenttype': {
'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"},
'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
},
'wall.album': {
'Meta': {'object_name': 'Album'},
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'identifier': ('django.db.models.fields.CharField', [], {'max_length': '200', 'db_index': 'True'}),
'title': ('django.db.models.fields.CharField', [], {'max_length': '4000', 'null': 'True', 'blank': 'True'}),
'url': ('django.db.models.fields.CharField', [], {'db_index': 'True', 'max_length': '300', 'null': 'True', 'blank': 'True'}),
'username': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '100', 'db_index': 'True', 'blank': 'True'})
},
'wall.croppedphoto': {
'Meta': {'object_name': 'CroppedPhoto'},
'hash': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'db_index': 'True'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'original_photo': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'crops'", 'to': "orm['wall.Photo']"}),
'url': ('django.db.models.fields.CharField', [], {'max_length': '500', 'db_index': 'True'}),
'user': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'cropped_photos'", 'null': 'True', 'to': "orm['auth.User']"})
},
'wall.photo': {
'Meta': {'object_name': 'Photo'},
'album': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'photos'", 'to': "orm['wall.Album']"}),
'height': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'thumbnail': ('django.db.models.fields.CharField', [], {'max_length': '500', 'db_index': 'True'}),
'title': ('django.db.models.fields.CharField', [], {'max_length': '4000', 'null': 'True', 'blank': 'True'}),
'url': ('django.db.models.fields.CharField', [], {'max_length': '500', 'db_index': 'True'}),
'width': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'})
},
'wall.provider': {
'Meta': {'object_name': 'Provider'},
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'provider_name': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'update_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
'username': ('django.db.models.fields.CharField', [], {'default': "'heynemann'", 'max_length': '100', 'db_index': 'True', 'blank': 'True'})
}
}

complete_apps = ['wall']
8 changes: 7 additions & 1 deletion myimgat/apps/wall/models.py
Expand Up @@ -2,6 +2,8 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
import logging import logging
from datetime import datetime, timedelta from datetime import datetime, timedelta
from os.path import splitext
from hashlib import md5


from django.db import models from django.db import models
from django.conf import settings from django.conf import settings
Expand Down Expand Up @@ -139,7 +141,11 @@ class CroppedPhoto(models.Model):
original_photo = models.ForeignKey(Photo, related_name='crops') original_photo = models.ForeignKey(Photo, related_name='crops')
user = models.ForeignKey(User, blank=True, null=True, related_name='cropped_photos') user = models.ForeignKey(User, blank=True, null=True, related_name='cropped_photos')
url = models.CharField(max_length=500, db_index=True) url = models.CharField(max_length=500, db_index=True)
hash = models.CharField(max_length=200, null=True, db_index=True)

def set_hash(self):
self.hash = md5(self.url).hexdigest()


def get_absolute_url(self): def get_absolute_url(self):
return reverse("cropped_photo_url", kwargs={'object_id': self.id}) return "%s.%s" % (self.hash, splitext(self.url)[-1].lstrip('.'))


5 changes: 3 additions & 2 deletions myimgat/apps/wall/static/wall/js/crop-popin.js
Expand Up @@ -24,9 +24,10 @@
share: function(e) { share: function(e) {
e.preventDefault(); e.preventDefault();
var data = Object.clone(this.shareButton.retrieve('crop-info')); var data = Object.clone(this.shareButton.retrieve('crop-info'));
data["id"] = this.image.id;
data[this.token.get('name')] = this.token.get('value'); data[this.token.get('name')] = this.token.get('value');
this.request.addEvent('success', function() { this.request.addEvent('success', function(url) {
console.log('sucesso'); console.log('url');
}).post(data); }).post(data);
}, },


Expand Down
1 change: 1 addition & 0 deletions myimgat/apps/wall/static/wall/js/init.js
Expand Up @@ -10,6 +10,7 @@
}); });
cropPopin.addEvent('onCropActive', function(image){ cropPopin.addEvent('onCropActive', function(image){
this.element.getElement('h2').set('text', image.title); this.element.getElement('h2').set('text', image.title);
cropPopin.image = image;
var photoContainer = this.element.getElement('.photo'); var photoContainer = this.element.getElement('.photo');
var photo = new Element('img', { var photo = new Element('img', {
events: { events: {
Expand Down
10 changes: 3 additions & 7 deletions myimgat/apps/wall/urls.py
Expand Up @@ -4,20 +4,16 @@
from django.conf.urls.defaults import patterns, url from django.conf.urls.defaults import patterns, url
from django.views.generic.list_detail import object_detail from django.views.generic.list_detail import object_detail


from wall.views import index, albums, save_cropped_photo from wall.views import index, albums, save_cropped_photo, shortened_url
from wall.models import CroppedPhoto, Photo from wall.models import Photo


urlpatterns = patterns('', urlpatterns = patterns('',


url('^$', index), url('^$', index),


url('^api/shorten/?$', save_cropped_photo), url('^api/shorten/?$', save_cropped_photo),
url('^api/(?P<username>[\w._-]+).(?P<extension>(json|jsonp))$', albums), url('^api/(?P<username>[\w._-]+).(?P<extension>(json|jsonp))$', albums),

url('^(?P<image_hash>.+?)[.](?:jpe?g|gif|png|JPE?G|GIF|PNG)$', shortened_url),
url('^(?P<object_id>\d+)[.](?:jpe?g|gif|png)$', object_detail, {
'queryset': CroppedPhoto.objects.all(),
'template_object_name': 'photo',
}, name="cropped_photo_url"),


url('^(?P<username>[\w._-]+)$', index), url('^(?P<username>[\w._-]+)$', index),


Expand Down
20 changes: 16 additions & 4 deletions myimgat/apps/wall/views.py
Expand Up @@ -2,10 +2,11 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-


from json import dumps from json import dumps
from os.path import join


from django.conf import settings from django.conf import settings
from django.shortcuts import render from django.shortcuts import render
from django.http import Http404, HttpResponse from django.http import Http404, HttpResponse, HttpResponsePermanentRedirect


from providers.base import format_url from providers.base import format_url


Expand Down Expand Up @@ -41,6 +42,7 @@ def albums(request, username=None, extension="json"):
} }
for photo in PhotoProxy.objects.load(album): for photo in PhotoProxy.objects.load(album):
album_data['photos'].append({ album_data['photos'].append({
'id': photo.id,
'url': photo.url, 'url': photo.url,
'title': photo.title, 'title': photo.title,
'thumbnail': photo.thumbnail, 'thumbnail': photo.thumbnail,
Expand All @@ -59,9 +61,9 @@ def albums(request, username=None, extension="json"):
raise Http404 raise Http404


@load_username @load_username
def save_cropped_photo(request): def save_cropped_photo(request, username=None):
identifier = request.POST['id'] identifier = request.POST['id']
photo = Photo.objects.get(int(identifier)) photo = Photo.objects.get(id=int(identifier))


left = request.POST['left'] left = request.POST['left']
top = request.POST['top'] top = request.POST['top']
Expand All @@ -81,4 +83,14 @@ def save_cropped_photo(request):
url=url url=url
) )


return cropped.get_absolute_url() cropped.set_hash()
cropped.save()

return HttpResponse(request.build_absolute_uri('../' + cropped.get_absolute_url()))

def shortened_url(request, image_hash):
obj = CroppedPhoto.objects.get(hash=image_hash)
if not obj:
raise Http404()
return HttpResponsePermanentRedirect(join(settings.THUMBOR_SERVER.rstrip('/'), obj.url.lstrip('/')))

2 changes: 1 addition & 1 deletion myimgat/settings.py
Expand Up @@ -153,7 +153,7 @@


# django-shorturls app settings # django-shorturls app settings
SHORTEN_MODELS = { SHORTEN_MODELS = {
'P': 'wall.photo', 'P': 'wall.cropped_photo',
} }
# end of django-shorturl app settings # end of django-shorturl app settings


Expand Down
1 change: 0 additions & 1 deletion myimgat/urls.py
Expand Up @@ -8,7 +8,6 @@


urlpatterns = patterns('', urlpatterns = patterns('',
url(r'', include('social_auth.urls')), url(r'', include('social_auth.urls')),
url(r's/', include('shorturls.urls')),
url(r'^favicon.ico$', redirect_to, {'url': '%sfavicon.ico' % settings.STATIC_URL}), url(r'^favicon.ico$', redirect_to, {'url': '%sfavicon.ico' % settings.STATIC_URL}),
url(r'^logout/$', 'django.contrib.auth.views.logout', {"next_page": "/"}, name="logout"), url(r'^logout/$', 'django.contrib.auth.views.logout', {"next_page": "/"}, name="logout"),
url(r'^privacy-policy', redirect_to, {'url': '/'}), url(r'^privacy-policy', redirect_to, {'url': '/'}),
Expand Down

0 comments on commit 10ded9b

Please sign in to comment.