Adding Delete Folder to the folder action menu. Uses a new algorithm that is far better and way more efficient than deleting each feed individually.

This commit is contained in:
Samuel Clay 2010-09-22 10:12:38 -04:00
parent b1096503a2
commit 9870276df1
5 changed files with 46 additions and 32 deletions

View file

@ -248,33 +248,30 @@ class UserSubscriptionFolders(models.Model):
user_sub.delete()
MUserStory.objects(user_id=self.user.pk, feed_id=feed_id).delete()
def delete_folder(self, folder_to_delete, in_folder):
def _find_folder_in_folders(old_folders, folder_name=''):
def delete_folder(self, folder_to_delete, in_folder, feed_ids_in_folder):
def _find_folder_in_folders(old_folders, folder_name, feeds_to_delete):
new_folders = []
for k, folder in enumerate(old_folders):
if isinstance(folder, int):
if (folder == folder_to_delete and (
(folder_name != in_folder) or
(folder_name == in_folder and deleted))):
multiples_found = True
logging.info(" ---> [%s] Deleting feed, and a multiple has been found in '%s'" % (self.user, folder_name))
if folder == folder_to_delete and folder_name == in_folder and not deleted:
logging.info(" ---> [%s] Delete feed: %s'th item: %s folders/feeds" % (
self.user, k, len(old_folders)
))
else:
new_folders.append(folder)
new_folders.append(folder)
if folder in feeds_to_delete:
feeds_to_delete.remove(folder)
elif isinstance(folder, dict):
for f_k, f_v in folder.items():
nf = _find_folder_in_folders(f_v, f_k, multiples_found, deleted)
new_folders.append({f_k: nf})
if f_k == folder_to_delete and folder_name == in_folder:
logging.info(" ---> [%s] Deleting folder '%s' in '%s': %s" % (self.user, f_k, folder_name, folder))
else:
nf, feeds_to_delete = _find_folder_in_folders(f_v, f_k, feeds_to_delete)
new_folders.append({f_k: nf})
return new_folders
return new_folders, feeds_to_delete
user_sub_folders = json.decode(self.folders)
user_sub_folders, multiples_found, deleted = _find_folder_in_folders(user_sub_folders)
user_sub_folders, feeds_to_delete = _find_folder_in_folders(user_sub_folders, '', feed_ids_in_folder)
self.folders = json.encode(user_sub_folders)
self.save()
UserSubscription.objects.filter(user=self.user, feed__in=feeds_to_delete).delete()
class Feature(models.Model):
"""

View file

@ -494,11 +494,13 @@ def delete_feed(request):
def delete_folder(request):
folder_to_delete = request.POST['folder_name']
in_folder = request.POST.get('in_folder', '')
feed_ids_in_folder = request.REQUEST.getlist('feed_id')
feed_ids_in_folder = [int(f) for f in feed_ids_in_folder]
# Works piss poor with duplicate folder titles, if they are both in the same folder.
# Deletes all, but only in the same folder parnet. But nobody should be doing this, right?
# Deletes all, but only in the same folder parent. But nobody should be doing that, right?
user_sub_folders = get_object_or_404(UserSubscriptionFolders, user=request.user)
user_sub_folders.delete_folder(folder_to_delete, in_folder)
user_sub_folders.delete_folder(folder_to_delete, in_folder, feed_ids_in_folder)
return dict(code=1)

View file

@ -2623,7 +2623,7 @@ background: transparent;
.NB-menu-manage li {
margin: 0 0 0 0;
padding: 5px 8px 5px 36px;
padding: 0;
cursor: pointer;
clear: both;
position: relative;
@ -2686,6 +2686,10 @@ background: transparent;
text-shadow: 0 1px 0 #000;
}
.NB-menu-manage li.NB-menu-manage-site-info:hover .NB-menu-manage-title {
text-shadow: none;
}
.NB-menu-manage .NB-disabled {
opacity: .4;
cursor: default;
@ -2780,8 +2784,17 @@ background: transparent;
display: none;
}
.NB-menu-manage .NB-menu-manage-feed .NB-menu-manage-image {
.NB-menu-manage .NB-menu-manage-image {
/* margin-left: 18px; */
padding: 5px 0 5px 36px;
}
.NB-menu-manage .NB-menu-manage-title {
padding: 5px 0 5px 0;
margin-left: 36px;
}
.NB-menu-manage .NB-menu-manage-subtitle {
margin: -5px 0 0 36px;
padding: 0 0 5px 0;
}
.NB-menu-manage .NB-menu-manage-feed {

View file

@ -379,11 +379,12 @@ NEWSBLUR.AssetModel.Reader.prototype = {
}
},
delete_folder: function(folder_name, in_folder, callback) {
delete_folder: function(folder_name, in_folder, feeds, callback) {
if (NEWSBLUR.Globals.is_authenticated) {
this.make_request('/reader/delete_folder', {
'folder_name': folder_name,
'in_folder': in_folder
'in_folder': in_folder,
'feed_id': feeds
}, callback, null);
} else {
if ($.isFunction(callback)) callback();

View file

@ -1125,7 +1125,7 @@
// If the active feed is under this folder, deselect it.
var feed_active = false;
feeds.each(_.bind(function(feed_id) {
_.each(feeds, _.bind(function(feed_id) {
if (self.active_feed == feed_id) {
this.reset_feed();
this.show_splash_page();
@ -2219,7 +2219,7 @@
$manage_menu = $.make('ul', { className: 'NB-menu-manage' }, [
$.make('li', { className: 'NB-menu-manage-site-info' }, [
$.make('div', { className: 'NB-menu-manage-image' }),
$.make('span', { className: 'feed_title' }, "Manage NewsBlur")
$.make('span', { className: 'NB-menu-manage-title' }, "Manage NewsBlur")
]).corner('tl tr 8px'),
$.make('li', { className: 'NB-menu-separator' }),
$.make('li', { className: 'NB-menu-manage-mark-read NB-menu-manage-site-mark-read' }, [
@ -2287,11 +2287,11 @@
$.make('div', { className: 'NB-menu-manage-image' }),
$.make('div', { className: 'NB-menu-manage-title' }, 'Mark folder as read')
]),
// $.make('li', { className: 'NB-menu-separator' }),
// $.make('li', { className: 'NB-menu-manage-feed NB-menu-manage-delete NB-menu-manage-folder-delete' }, [
// $.make('div', { className: 'NB-menu-manage-image' }),
// $.make('div', { className: 'NB-menu-manage-title' }, 'Delete this folder')
// ]),
$.make('li', { className: 'NB-menu-separator' }),
$.make('li', { className: 'NB-menu-manage-feed NB-menu-manage-delete NB-menu-manage-folder-delete' }, [
$.make('div', { className: 'NB-menu-manage-image' }),
$.make('div', { className: 'NB-menu-manage-title' }, 'Delete this folder')
]),
$.make('li', { className: 'NB-menu-manage-feed NB-menu-manage-delete-confirm NB-menu-manage-folder-delete-confirm' }, [
$.make('div', { className: 'NB-menu-manage-image' }),
$.make('div', { className: 'NB-menu-manage-title' }, 'Really delete?')
@ -2474,11 +2474,12 @@
var self = this;
var in_folder = '';
var $parent = $folder.parents('li.folder');
var feeds = this.get_feed_ids_in_folder($folder);
if ($parent.length) {
in_folder = $parent.eq(0).find('.folder_title_text').eq(0).text();
}
this.model.delete_folder(folder, in_folder, function() {
this.model.delete_folder(folder, in_folder, feeds, function() {
self.delete_folder(folder, $folder);
});
},