mirror of
https://github.com/samuelclay/NewsBlur.git
synced 2025-09-18 21:50:56 +00:00
Making tags uniform across the site. Also beginning the final modal: Add feed.
This commit is contained in:
parent
adeab1652a
commit
1366f5e750
7 changed files with 145 additions and 90 deletions
|
@ -120,7 +120,11 @@ def get_classifiers_for_user(user, feed, classifier_feeds=None, classifier_autho
|
|||
classifier_tags = ClassifierTag.objects.filter(user=user, feed=feed)
|
||||
|
||||
payload = {
|
||||
'feeds': dict([(f.id, f.score) for f in classifier_feeds]),
|
||||
'feeds': dict((f.feed.feed_link, {
|
||||
'feed_title': f.feed.feed_title,
|
||||
'feed_link': f.feed.feed_link,
|
||||
'score': f.score
|
||||
}) for f in classifier_feeds),
|
||||
'authors': dict([(a.author.author_name, a.score) for a in classifier_authors]),
|
||||
'titles': dict([(t.title, t.score) for t in classifier_titles]),
|
||||
'tags': dict([(t.tag.name, t.score) for t in classifier_tags]),
|
||||
|
|
|
@ -76,8 +76,8 @@ def save_classifier_publisher(request):
|
|||
message = 'OK'
|
||||
payload = {}
|
||||
|
||||
def _save_classifier(opinions, ContentCls, ClassifierCls, content_type, post_content_field):
|
||||
for opinion, score in opinions.items():
|
||||
def _save_classifier(ClassifierCls, content_type, ContentCls=None, post_content_field=None):
|
||||
for opinion, score in {'like_'+content_type: 1, 'dislike_'+content_type: -2}.items():
|
||||
if opinion in post:
|
||||
post_contents = post.getlist(opinion)
|
||||
for post_content in post_contents:
|
||||
|
@ -88,26 +88,27 @@ def save_classifier_publisher(request):
|
|||
'score': score
|
||||
}
|
||||
}
|
||||
if ContentCls:
|
||||
# Can't use post_content. lookup content and refer to that. Authors, Tags.
|
||||
if content_type in ('author', 'tag'):
|
||||
# Use content to lookup object. Authors, Tags.
|
||||
content_dict = {
|
||||
post_content_field: post_content,
|
||||
'feed': feed
|
||||
}
|
||||
content = ContentCls.objects.get(**content_dict)
|
||||
classifier_dict.update({content_type: content})
|
||||
elif content_type:
|
||||
elif content_type in ('title',):
|
||||
# Skip content lookup and just use content directly. Titles.
|
||||
classifier_dict.update({content_type: post_content})
|
||||
|
||||
classifier, _ = ClassifierCls.objects.get_or_create(**classifier_dict)
|
||||
if classifier.score != score:
|
||||
classifier.score = score
|
||||
classifier.save()
|
||||
|
||||
_save_classifier({'like_author': 1, 'dislike_author': -1}, StoryAuthor, ClassifierAuthor, 'author', 'author_name')
|
||||
_save_classifier({'like_tag': 1, 'dislike_tag': -1}, Tag, ClassifierTag, 'tag', 'name')
|
||||
_save_classifier({'like_title': 1, 'dislike_title': -1}, None, ClassifierTitle, 'title', None)
|
||||
_save_classifier({'like_publisher': 1, 'dislike_publisher': -1}, None, ClassifierFeed, None, None)
|
||||
_save_classifier(ClassifierAuthor, 'author', StoryAuthor, 'author_name')
|
||||
_save_classifier(ClassifierTag, 'tag', Tag, 'name')
|
||||
_save_classifier(ClassifierTitle, 'title')
|
||||
_save_classifier(ClassifierFeed, 'publisher')
|
||||
|
||||
response = dict(code=code, message=message, payload=payload)
|
||||
return response
|
||||
|
|
|
@ -31,8 +31,11 @@ SINGLE_DAY = 60*60*24
|
|||
|
||||
@never_cache
|
||||
def index(request):
|
||||
print "User: %s" % request.user
|
||||
form = AuthenticationForm(request.POST)
|
||||
if request.method == "POST":
|
||||
form = AuthenticationForm(request.POST)
|
||||
else:
|
||||
form = AuthenticationForm()
|
||||
|
||||
return render_to_response('reader/feeds.xhtml', {'form': form},
|
||||
context_instance=RequestContext(request))
|
||||
|
||||
|
|
|
@ -1007,13 +1007,12 @@ form.opml_import_form input {
|
|||
}
|
||||
|
||||
.NB-modal .NB-modal-field {
|
||||
margin: 0 0 0 24px;
|
||||
margin: 0;
|
||||
position: relative;
|
||||
clear: both;
|
||||
}
|
||||
|
||||
.NB-modal .NB-modal-field h5 {
|
||||
margin-left: -24px;
|
||||
}
|
||||
|
||||
.NB-modal .NB-modal-field input[type=text] {
|
||||
|
@ -1022,7 +1021,7 @@ form.opml_import_form input {
|
|||
}
|
||||
|
||||
.NB-modal .NB-modal-field input[type=checkbox] {
|
||||
margin: 4px 0 0 -20px;
|
||||
margin: 4px 0 0 0px;
|
||||
float: left;
|
||||
}
|
||||
|
||||
|
@ -1070,7 +1069,6 @@ form.opml_import_form input {
|
|||
}
|
||||
|
||||
.NB-classifier .NB-publisher .NB-classifier-authors {
|
||||
margin-left: -24px;
|
||||
}
|
||||
|
||||
.NB-classifier .NB-publisher .NB-classifier-authors .NB-classifier-author {
|
||||
|
@ -1091,6 +1089,10 @@ form.opml_import_form input {
|
|||
margin: 2px 6px 6px 0;
|
||||
}
|
||||
|
||||
.NB-classifier .NB-classifier-tag-container .NB-classifier {
|
||||
margin: 0 2px 0 0;
|
||||
}
|
||||
|
||||
.NB-classifier .NB-classifier-tag {
|
||||
background-color: #E0E0FF;
|
||||
padding: 2px 6px 2px 0px;
|
||||
|
@ -1110,10 +1112,6 @@ form.opml_import_form input {
|
|||
margin: 0 6px 0 2px;
|
||||
}
|
||||
|
||||
.NB-classifier .NB-classifier-tags {
|
||||
margin-left: -24px;
|
||||
}
|
||||
|
||||
.NB-classifier .NB-modal-title .NB-classifier-like {
|
||||
color: #3D931B;
|
||||
}
|
||||
|
@ -1126,6 +1124,10 @@ form.opml_import_form input {
|
|||
overflow: auto;
|
||||
}
|
||||
|
||||
.NB-classifiers {
|
||||
margin-left: 24px;
|
||||
}
|
||||
|
||||
/* ======================= */
|
||||
/* = Intelligence Slider = */
|
||||
/* ======================= */
|
||||
|
@ -1201,41 +1203,6 @@ form.opml_import_form input {
|
|||
clear: both;
|
||||
}
|
||||
|
||||
.NB-manage .NB-classifier {
|
||||
white-space: nowrap;
|
||||
float: left;
|
||||
display: block;
|
||||
margin: 2px 6px 6px 0;
|
||||
cursor: pointer;
|
||||
padding: 2px 6px 2px 0px;
|
||||
}
|
||||
|
||||
.NB-manage .NB-classifier input[type=checkbox] {
|
||||
margin: 0px 4px 0px;
|
||||
float: none;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.NB-manage .NB-classifier label {
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.NB-manage .NB-classifier.NB-classifier-tag {
|
||||
background-color: #E0E0FF;
|
||||
}
|
||||
|
||||
.NB-manage .NB-classifier.NB-classifier-title {
|
||||
background-color: yellow;
|
||||
}
|
||||
|
||||
.NB-manage .NB-classifier.NB-classifier-author {
|
||||
background-color: orange;
|
||||
}
|
||||
|
||||
.NB-manage .NB-classifier.NB-classifier-publisher {
|
||||
background-color: purple;
|
||||
}
|
||||
|
||||
.NB-manage .NB-classifier-empty {
|
||||
margin: 0 0 0 12px;
|
||||
font-size: 12px;
|
||||
|
@ -1301,4 +1268,63 @@ form.opml_import_form input {
|
|||
text-decoration: underline;
|
||||
color: #DBDBDB;
|
||||
display: none;
|
||||
}
|
||||
|
||||
/* =================== */
|
||||
/* = Classifier Tags = */
|
||||
/* =================== */
|
||||
|
||||
.NB-classifiers {
|
||||
clear: both;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
|
||||
.NB-classifiers ::-moz-selection {
|
||||
background: transparent;
|
||||
}
|
||||
|
||||
.NB-classifiers ::selection {
|
||||
background: transparent;
|
||||
}
|
||||
|
||||
.NB-classifiers .NB-classifier {
|
||||
white-space: nowrap;
|
||||
float: left;
|
||||
display: block;
|
||||
margin: 2px 6px 6px 0;
|
||||
cursor: pointer;
|
||||
padding: 2px 9px 2px 4px;
|
||||
}
|
||||
|
||||
.NB-classifiers .NB-classifier input[type=checkbox] {
|
||||
margin: 0px 4px 0px;
|
||||
float: none;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.NB-classifiers .NB-classifier label {
|
||||
cursor: pointer;
|
||||
color: black;
|
||||
text-shadow: 1px 1px 0 #ccc;
|
||||
}
|
||||
|
||||
.NB-classifiers .NB-classifier.NB-classifier-tag {
|
||||
background-color: #FFA200;
|
||||
}
|
||||
|
||||
.NB-classifiers .NB-classifier.NB-classifier-title {
|
||||
background-color: #FF7940;
|
||||
}
|
||||
|
||||
.NB-classifiers .NB-classifier.NB-classifier-author {
|
||||
background-color: #60D6A7;
|
||||
}
|
||||
|
||||
.NB-classifiers .NB-classifier.NB-classifier-publisher {
|
||||
background-color: #6a93d4;
|
||||
}
|
||||
|
||||
.NB-classifiers .NB-classifier.NB-classifier-facet-disabled {
|
||||
background-color: white;
|
||||
}
|
|
@ -23,7 +23,16 @@ NEWSBLUR.ReaderAddFeed.prototype = {
|
|||
$.make('form', { method: 'post', enctype: 'multipart/form-data', className: 'NB-add-form' }, [
|
||||
$.make('div', { className: 'NB-add-field' }, [
|
||||
$.make('h5', 'Search for a publisher'),
|
||||
$.make('div', { className: 'NB-add-fields' }, [
|
||||
$.make('div', [
|
||||
$.make('label', { 'for': 'NB-add-url' }, 'URL: '),
|
||||
$.make('input', { id: 'NB-add-url', name: 'url' })
|
||||
])
|
||||
]),
|
||||
$.make('h5', 'Import from Google Reader'),
|
||||
$.make('div', { className: 'NB-add-fields' }, [
|
||||
$.make('div', { className: 'NB-disabled' }, 'Google Reader integration coming in the next few months.')
|
||||
]),
|
||||
$.make('h5', 'Upload OPML (from Google Reader)'),
|
||||
$.make('input', { type: 'file', name: 'file', id: 'opml_file_input' }),
|
||||
$.make('input', { type: 'submit', className: 'NB-add-opml-button', value: 'Upload OPML File' }).click(function(e) {
|
||||
|
|
|
@ -63,7 +63,7 @@ var classifier = {
|
|||
for (var fa in this.feed_authors) {
|
||||
var feed_author = this.feed_authors[fa];
|
||||
if (feed_author[0]) {
|
||||
var $author = $.make('span', { className: 'NB-classifier-author' }, [
|
||||
var $author = $.make('span', { className: 'NB-classifier-author NB-classifier' }, [
|
||||
$.make('input', { type: 'checkbox', name: 'author', value: feed_author[0], id: 'classifier_author_'+fa }),
|
||||
$.make('label', { 'for': 'classifier_author_'+fa }, feed_author[0])
|
||||
]);
|
||||
|
@ -77,7 +77,7 @@ var classifier = {
|
|||
var tag = this.feed_tags[t];
|
||||
var checked = (tag[0] in this.model.classifiers.tags) ? 'checked' : 'false';
|
||||
var $tag = $.make('span', { className: 'NB-classifier-tag-container' }, [
|
||||
$.make('span', { className: 'NB-classifier-tag' }, [
|
||||
$.make('span', { className: 'NB-classifier-tag NB-classifier' }, [
|
||||
$.make('input', { type: 'checkbox', name: 'tag', value: tag[0], id: 'classifier_tag_'+t, checked: checked }),
|
||||
$.make('label', { 'for': 'classifier_tag_'+t }, [
|
||||
$.make('b', tag[0])
|
||||
|
@ -95,20 +95,24 @@ var classifier = {
|
|||
this.$classifier = $.make('div', { className: 'NB-classifier NB-modal' }, [
|
||||
$.make('h2', { className: 'NB-modal-title' }),
|
||||
$.make('form', { method: 'post', className: 'NB-publisher' }, [
|
||||
($feed_authors.length && $.make('div', { className: 'NB-modal-field' }, [
|
||||
($feed_authors.length && $.make('div', { className: 'NB-modal-field NB-classifiers' }, [
|
||||
$.make('h5', 'Authors'),
|
||||
$.make('div', { className: 'NB-classifier-authors' }, $feed_authors)
|
||||
$.make('div', { className: 'NB-classifier-authors NB-classifiers' }, $feed_authors)
|
||||
])),
|
||||
($feed_tags.length && $.make('div', { className: 'NB-modal-field' }, [
|
||||
$.make('h5', 'Categories & Tags'),
|
||||
$.make('div', { className: 'NB-classifier-tags' }, $feed_tags)
|
||||
$.make('div', { className: 'NB-classifier-tags NB-classifiers' }, $feed_tags)
|
||||
])),
|
||||
$.make('div', { className: 'NB-modal-field' }, [
|
||||
$.make('div', { className: 'NB-modal-field NB-classifiers' }, [
|
||||
$.make('h5', 'Everything by This Publisher'),
|
||||
$.make('input', { type: 'checkbox', name: 'facet', value: 'publisher', id: 'classifier_publisher' }),
|
||||
$.make('label', { 'for': 'classifier_publisher' }, [
|
||||
$.make('img', { className: 'feed_favicon', src: this.google_favicon_url + feed.feed_link }),
|
||||
$.make('span', { className: 'feed_title' }, feed.feed_title)
|
||||
$.make('div', { className: 'NB-classifiers' }, [
|
||||
$.make('div', { className: 'NB-classifier NB-classifier-publisher' }, [
|
||||
$.make('input', { type: 'checkbox', name: 'facet', value: 'publisher', id: 'classifier_publisher' }),
|
||||
$.make('label', { 'for': 'classifier_publisher' }, [
|
||||
$.make('img', { className: 'feed_favicon', src: this.google_favicon_url + feed.feed_link }),
|
||||
$.make('span', { className: 'feed_title' }, feed.feed_title)
|
||||
])
|
||||
])
|
||||
])
|
||||
]),
|
||||
$.make('div', { className: 'NB-modal-submit' }, [
|
||||
|
@ -151,12 +155,10 @@ var classifier = {
|
|||
if (tag in this.model.classifiers.tags && this.model.classifiers.tags[tag] == this.score) {
|
||||
input_attrs['checked'] = 'checked';
|
||||
}
|
||||
var $tag = $.make('span', { className: 'NB-classifier-tag-container' }, [
|
||||
$.make('span', { className: 'NB-classifier-tag' }, [
|
||||
$.make('input', input_attrs),
|
||||
$.make('label', { 'for': 'classifier_tag_'+t }, [
|
||||
$.make('b', tag)
|
||||
])
|
||||
var $tag = $.make('span', { className: 'NB-classifier-tag-container NB-classifier NB-classifier-tag' }, [
|
||||
$.make('input', input_attrs),
|
||||
$.make('label', { 'for': 'classifier_tag_'+t }, [
|
||||
$.make('b', tag)
|
||||
])
|
||||
]);
|
||||
$story_tags.push($tag);
|
||||
|
@ -175,33 +177,43 @@ var classifier = {
|
|||
$.make('form', { method: 'post' }, [
|
||||
(story.story_title && $.make('div', { className: 'NB-modal-field' }, [
|
||||
$.make('h5', 'Story Title'),
|
||||
$.make('input', { type: 'checkbox', name: 'facet', value: 'title', id: 'classifier_title' }),
|
||||
$.make('input', { type: 'text', value: story.story_title, className: 'NB-classifier-title-highlight' }),
|
||||
$.make('label', { 'for': 'classifier_title' }, [
|
||||
$.make('div', { className: 'NB-classifier-title-display' }, [
|
||||
'Look for: ',
|
||||
$.make('span', { className: 'NB-classifier-title NB-classifier-facet-disabled' }, 'Highlight phrases to look for in future stories'),
|
||||
$.make('input', { name: 'title', value: '', type: 'hidden', className: 'NB-classifier-title-hidden' })
|
||||
$.make('div', { className: 'NB-classifiers' }, [
|
||||
$.make('input', { type: 'checkbox', name: 'facet', value: 'title', id: 'classifier_title' }),
|
||||
$.make('input', { type: 'text', value: story.story_title, className: 'NB-classifier-title-highlight' }),
|
||||
$.make('label', { 'for': 'classifier_title' }, [
|
||||
$.make('div', { className: 'NB-classifier-title-display' }, [
|
||||
'Look for: ',
|
||||
$.make('span', { className: 'NB-classifier-title NB-classifier-facet-disabled' }, 'Highlight phrases to look for in future stories'),
|
||||
$.make('input', { name: 'title', value: '', type: 'hidden', className: 'NB-classifier-title-hidden' })
|
||||
])
|
||||
])
|
||||
])
|
||||
])),
|
||||
(story.story_authors && $.make('div', { className: 'NB-modal-field' }, [
|
||||
$.make('h5', 'Story Author'),
|
||||
$story_author,
|
||||
$.make('label', { 'for': 'classifier_author' }, [
|
||||
$.make('b', story.story_authors)
|
||||
$.make('div', { className: 'NB-classifiers' }, [
|
||||
$.make('div', { className: 'NB-classifier NB-classifier-author' }, [
|
||||
$story_author,
|
||||
$.make('label', { 'for': 'classifier_author' }, [
|
||||
$.make('b', story.story_authors)
|
||||
])
|
||||
])
|
||||
])
|
||||
])),
|
||||
($story_tags.length && $.make('div', { className: 'NB-modal-field' }, [
|
||||
$.make('h5', 'Story Categories & Tags'),
|
||||
$.make('div', { className: 'NB-classifier-tags' }, $story_tags)
|
||||
$.make('div', { className: 'NB-classifier-tags NB-classifiers' }, $story_tags)
|
||||
])),
|
||||
$.make('div', { className: 'NB-modal-field' }, [
|
||||
$.make('h5', 'Everything by This Publisher'),
|
||||
$.make('input', { type: 'checkbox', name: 'facet', value: 'publisher', id: 'classifier_publisher' }),
|
||||
$.make('label', { 'for': 'classifier_publisher' }, [
|
||||
$.make('img', { className: 'feed_favicon', src: this.google_favicon_url + feed.feed_link }),
|
||||
$.make('span', { className: 'feed_title' }, feed.feed_title)
|
||||
$.make('div', { className: 'NB-classifiers' }, [
|
||||
$.make('div', { className: 'NB-classifier NB-classifier-publisher' }, [
|
||||
$.make('input', { type: 'checkbox', name: 'facet', value: 'publisher', id: 'classifier_publisher' }),
|
||||
$.make('label', { 'for': 'classifier_publisher' }, [
|
||||
$.make('img', { className: 'feed_favicon', src: this.google_favicon_url + feed.feed_link }),
|
||||
$.make('span', { className: 'feed_title' }, feed.feed_title)
|
||||
])
|
||||
])
|
||||
])
|
||||
]),
|
||||
$.make('div', { className: 'NB-modal-submit' }, [
|
||||
|
@ -246,7 +258,7 @@ var classifier = {
|
|||
},
|
||||
'onShow': function(dialog) {
|
||||
$('#simplemodal-container').corner('6px').css({'width': 600, 'height': height});
|
||||
$('.NB-classifier-tag', self.$classifier).corner('4px');
|
||||
$('.NB-classifier', self.$classifier).corner('14px');
|
||||
},
|
||||
'onClose': function(dialog) {
|
||||
dialog.data.hide().empty().remove();
|
||||
|
|
|
@ -139,8 +139,8 @@ NEWSBLUR.ReaderManageFeed.prototype = {
|
|||
// Publisher
|
||||
var $publishers = $.make('div', { className: 'NB-classifiers NB-classifier-publishers'});
|
||||
for (var p in classifiers.feeds) {
|
||||
if (classifiers.feeds[p] == score) {
|
||||
var $publisher = this.make_tag(p, i++, opinion);
|
||||
if (classifiers.feeds[p].score == score) {
|
||||
var $publisher = this.make_publisher(classifiers.feeds[p], i++, opinion);
|
||||
$publishers.append($publisher);
|
||||
}
|
||||
}
|
||||
|
@ -232,7 +232,7 @@ NEWSBLUR.ReaderManageFeed.prototype = {
|
|||
var $classifiers_dislikes = this.make_classifiers(classifiers.payload, -1);
|
||||
$dislikes.empty().append($classifiers_dislikes);
|
||||
|
||||
$('.NB-classifier', this.$manage).corner('4px');
|
||||
$('.NB-classifier', this.$manage).corner('14px');
|
||||
},
|
||||
|
||||
open_modal: function() {
|
||||
|
|
Loading…
Add table
Reference in a new issue