Skip to content

Commit

Permalink
Merge 384b3c2 into 27f546c
Browse files Browse the repository at this point in the history
  • Loading branch information
mkouhei committed Jul 13, 2014
2 parents 27f546c + 384b3c2 commit a4c3d88
Show file tree
Hide file tree
Showing 18 changed files with 236 additions and 163 deletions.
6 changes: 3 additions & 3 deletions README.rst
Expand Up @@ -40,11 +40,11 @@ Requirements
* defusedxml
* requests
* celery
* jQuery (>= 1.7.2)
* jQuery (>= 2.1.1)
* underscore.js (>= 1.5.2)
* backbone.js (>= 1.1.0)
* JSON in JavaScript
* Twitter bootstrap (>= 2.0.2)
* Twitter bootstrap (>= 3.2.0)

Recommends
----------
Expand All @@ -64,7 +64,7 @@ Shiori depends on as following.::
$ sudo apt-get install python-django python-djangorestframework \
python-django-shortuuidfield python-django-auth-openid python-celery \
python-lxml python-defusedxml python-netaddr python-django-south \
libjs-jquery libjs-underscore libjs-json libjs-twitter-bootstrap \
libjs-jquery libjs-underscore libjs-json \
libxml2-dev libxslt1-dev python-requests python-dev libpython2.7-dev \
python-django-jsonfield

Expand Down
9 changes: 9 additions & 0 deletions docs/HISTORY.rst
@@ -1,6 +1,15 @@
History
-------


0.4.0 (2014-07-13)
^^^^^^^^^^^^^^^^^^

* Applied Bootstrap 3.
* Fixed link of category and tag.
* Fixed jslint violations.
* Improved loading bookmark.

0.3.4 (2014-06-02)
^^^^^^^^^^^^^^^^^^

Expand Down
5 changes: 3 additions & 2 deletions requirements.txt
@@ -1,16 +1,17 @@
pep8>=1.3
pytest
django >= 1.6
Django >= 1.6
djangorestframework
shortuuid == 0.3.2
django-shortuuidfield
django_shortuuidfield
django-jsonfield
python-openid
south
celery
lxml
defusedxml
requests
pyquery
netaddr
-e bzr+http://bazaar.launchpad.net/~andrewsomething/django-openid-auth/1252445#egg=django-openid-auth
closure-linter
5 changes: 4 additions & 1 deletion setup.py
Expand Up @@ -59,15 +59,18 @@ def run_tests(self):
'shortuuid == 0.3.2',
'django_shortuuidfield',
'django-jsonfield',
'south',
'celery',
'python-openid',
'django-openid-auth',
'lxml',
'defusedxml',
'requests',
'pyquery',
'netaddr']

setup(name='shiori',
version='0.3.4',
version='0.4.0',
description='bookmarking tool based on Web UI and JSON REST API',
long_description=long_description,
author='Kouhei Maeda',
Expand Down
2 changes: 1 addition & 1 deletion shiori/api/serializers.py
Expand Up @@ -28,7 +28,7 @@ class Meta(object):

class BookmarkSerializer(serializers.ModelSerializer):
""" Serializer for shiori.bookmark.models.Bookmark """

title = serializers.Field(source='title')
category = serializers.SlugRelatedField(many=False, slug_field='category')
category_id = serializers.Field(source='category.id')
tags = serializers.SlugRelatedField(many=True, slug_field='tag',
Expand Down
19 changes: 19 additions & 0 deletions shiori/bookmark/models.py
Expand Up @@ -5,6 +5,7 @@
from django.contrib.auth.models import User
from shortuuidfield import ShortUUIDField
import jsonfield
from pyquery import PyQuery
from shiori.bookmark.agents.feed_parser import FeedParser
from shiori.bookmark import validators

Expand Down Expand Up @@ -67,6 +68,24 @@ def get_absolute_url(self):
return "/shiori/b/%s" % self.id


def retrieve_title(sender, instance, **kwargs):
""" Retreive title of specified url.
Arguments:
sender: :model (Bookmark)
instance: Bookmark instance
**kwargs: not use
"""
if instance.title:
return instance.title
else:
if validators.validate_url(instance.url):
data = PyQuery(instance.url)
instance.title = data('head title').text()

pre_save.connect(retrieve_title, sender=Bookmark)


class BookmarkTag(models.Model):
""" BookmarkTag model """
id = models.AutoField(primary_key=True)
Expand Down
12 changes: 7 additions & 5 deletions shiori/bookmark/validators.py
Expand Up @@ -7,7 +7,7 @@
else:
from urlparse import urlparse
from netaddr import IPAddress, AddrFormatError
from socket import gaierror, gethostbyname, getaddrinfo, AF_INET6
import socket
from shiori.core.settings import FEED_EXCLUDE_FQDN


Expand Down Expand Up @@ -46,15 +46,17 @@ def getaddr(hostname):
"""
addresses = []
try:
addresses.append(gethostbyname(hostname))
addresses.append(socket.gethostbyname(hostname))
except TypeError as error:
print(error)
except gaierror as error:
except socket.gaierror as error:
print(error)
try:
addresses.append(getaddrinfo(hostname, None, AF_INET6)[0][4][0])
addresses.append(socket.getaddrinfo(hostname,
None,
socket.AF_INET6)[0][4][0])
except TypeError as error:
print(error)
except gaierror as error:
except socket.gaierror as error:
print(error)
return addresses
4 changes: 3 additions & 1 deletion shiori/static/css/main.css
@@ -1,4 +1,6 @@
div.row { margin-top: 3em; }
span.help { color: #757575; }
div.footer { position: absolute; bottom: 0; color: #555;}
div.footer a { color: #f66; }
div.footer a { color: #f66; }
a.btn { margin-bottom: 3px }
ul.profile { list-style-type: none; }
88 changes: 50 additions & 38 deletions shiori/static/js/main.js
Expand Up @@ -8,23 +8,25 @@ $(function() {
if (tags == undefined) {
return '';
} else {
return '<p><i class="' + icon + '"></i> ' + tags + '</p>';
return '<p><span class="glyphicon glyphicon-' + icon + '">' +
'</span> ' + tags + '</p>';
}
}

function protect(state) {
if (state) {
return '<i class="icon-lock"></i> ';
return '<span class="glyphicon glyphicon-lock"></span> ';
} else {
return '';
}
}

function get_page(url) {
var s;
if (url) {
var s = url.split('?')[1];
s = url.split('?')[1];
} else {
var s = location.search.substring(1);
s = location.search.substring(1);
}
var page;
if (s) {
Expand Down Expand Up @@ -146,7 +148,9 @@ $(function() {
} else {
$(this.el)
.append('<a class="btn btn-primary" href="categories/' +
item.get('id') + '">' +
item.get('id') +
'?is_all=' + is_all() +
'">' +
html_sanitize(item.get('category'), urlX, idX) +
'</a> ');
}
Expand All @@ -164,17 +168,18 @@ $(function() {
this.bookmarks = new BookmarkList();
this.listenTo(this.bookmarks, 'add', this.appendItem);
this.listenTo(this.model, 'change', this.render);
this.model.fetch();
this.model.fetch({data: {'page': get_page(),
'is_all': is_all()}});
},
events: {
'mouseover a.btn': 'loadBookmark'
'click a.btn': 'loadBookmark'
},
render: function() {
var category = this.model.get('category');
$('h4', this.el).append(category);
this.bookmarks.fetch({data: {'page': get_page(),
'is_all': is_all(),
'categor': category}});
'category': category}});
return this;
},
appendItem: function(item) {
Expand Down Expand Up @@ -206,14 +211,13 @@ $(function() {
content: elem('<a href="' + item.get('url') +
'">' +
item.get('url') + '</a>',
'icon-share') +
elem(item.get('description'), 'icon-comment') +
elem(item.get('tags'), 'icon-tags'),
'link') +
elem(item.get('description'), 'comment') +
elem(item.get('tags'), 'tags'),
trigger: 'manual',
delay: {show: 100, hide: 100}
}).click(function(e) {
$(this).popover('toggle');
});
$('a#' + item.id, this.el).popover('toggle');
},
pagination: function(meta) {
$('ul.pager').append(render_pagination(meta));
Expand Down Expand Up @@ -294,7 +298,9 @@ $(function() {
} else {
$(this.el)
.append('<a class="btn btn-info" href="tags/' +
item.get('id') + '">' +
item.get('id') +
'?is_all=' + is_all() +
'">' +
html_sanitize(item.get('tag'), urlX, idX) +
'</a> ');
}
Expand All @@ -312,10 +318,10 @@ $(function() {
this.bookmarks = new BookmarkList();
this.listenTo(this.bookmarks, 'add', this.appendItem);
this.listenTo(this.model, 'change', this.render);
this.model.fetch();
this.model.fetch({data: {'is_all': is_all()}});
},
events: {
'mouseover a.btn': 'loadBookmark'
'click a.btn': 'loadBookmark'
},
render: function() {
var that = this;
Expand Down Expand Up @@ -360,17 +366,15 @@ $(function() {
content: elem('<a href="' + item.get('url') +
'">' +
item.get('url') + '</a>',
'icon-share') +
'link') +
elem(html_sanitize(item.get('description'),
urlX, idX),
'icon-comment') +
'comment') +
elem(html_sanitize(item.get('category'), urlX, idX),
'icon-book'),
'book'),
trigger: 'manual',
delay: {show: 100, hide: 100}
}).click(function(e) {
$(this).popover('toggle');
});
delay: {show: 100, hide: 100}});
$('a#' + item.id, this.el).popover('toggle');
}
});

Expand Down Expand Up @@ -411,7 +415,7 @@ $(function() {
'search': search_word()}});
},
events: {
'mouseover a.btn': 'loadBookmark'
'click a.btn': 'loadBookmark'
},
appendItem: function(item) {
if (item.get('meta')) {
Expand Down Expand Up @@ -444,23 +448,22 @@ $(function() {
content: elem('<a href="' + item.get('url') +
'">' +
item.get('url') + '</a>',
'icon-share') +
'link') +
elem(html_sanitize(item.get('description'),
urlX, idX),
'icon-comment') +
'comment') +
elem('<a href="categories/' +
html_sanitize(item.get('category_id'),
urlX, idX) +
'">' + html_sanitize(item.get('category'),
urlX, idX) + '</a>',
'icon-book') +
'book') +
elem(html_sanitize(item.get('tags'), urlX, idX),
'icon-tags'),
'tags'),
trigger: 'manual',
delay: {show: 100, hide: 100}
}).click(function(e) {
$(this).popover('toggle');
});
$('a#' + item.id, this.el).popover('toggle');
}
});

Expand Down Expand Up @@ -568,10 +571,11 @@ $(function() {

var description = html_sanitize(
this.$('textarea#description').val(), urlX, idX);
var is_hide;
if (this.$('input#is_hide').prop('checked')) {
var is_hide = true;
is_hide = true;
} else {
var is_hide = false;
is_hide = false;
}

this.bookmarks.create({
Expand All @@ -594,7 +598,15 @@ $(function() {
},
error: function(_coll, xhr, options) {
console.log(xhr.responseText);
display_message(this.el, xhr.responseText, 'alert-error');
if (xhr.responseText.search('IntegrityError') == 0) {
display_message(this.el,
'Input title why cannot get title.',
'alert-error');
} else {
display_message(this.el,
xhr.responseText,
'alert-error');
}
}
});
},
Expand Down Expand Up @@ -846,7 +858,7 @@ $(function() {
'click a#profile': 'profile',
'click a#categories': 'categories',
'click a#tags': 'tags',
'click span#search-btn': 'search',
'click button#search-btn': 'search',
'click input#is_all': 'toggle_view'
},
initialize: function() {
Expand Down Expand Up @@ -902,9 +914,10 @@ $(function() {
return false;
},
render: function() {
$('div#submenu', this.el)
.append('<a id="categories">Categories</a>')
.append('<a id="tags">Tags</a>');
$('div#submenu ul', this.el)
.append('<li><a id="categories" data-toggle="pill">' +
'Categories</a></li>')
.append('<li><a id="tags" data-toggle="pill">Tags</a></li>');
if (is_all() == 'true') {
$('input#is_all').attr('checked', true);
} else {
Expand Down Expand Up @@ -951,7 +964,6 @@ $(function() {
categories: function() {
window.App.render();
var categoriesListView = new CategoriesListView();
categoriesListView.render();
},
category: function(id) {
window.App.render();
Expand Down

0 comments on commit a4c3d88

Please sign in to comment.