Making tags uniform across the site. Also beginning the final modal: Add feed.

This commit is contained in:
Samuel Clay 2010-04-03 00:59:03 -04:00
parent adeab1652a
commit 1366f5e750
7 changed files with 145 additions and 90 deletions

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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