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() user_sub.delete()
MUserStory.objects(user_id=self.user.pk, feed_id=feed_id).delete() MUserStory.objects(user_id=self.user.pk, feed_id=feed_id).delete()
def delete_folder(self, folder_to_delete, in_folder): def delete_folder(self, folder_to_delete, in_folder, feed_ids_in_folder):
def _find_folder_in_folders(old_folders, folder_name=''): def _find_folder_in_folders(old_folders, folder_name, feeds_to_delete):
new_folders = [] new_folders = []
for k, folder in enumerate(old_folders): for k, folder in enumerate(old_folders):
if isinstance(folder, int): if isinstance(folder, int):
if (folder == folder_to_delete and ( new_folders.append(folder)
(folder_name != in_folder) or if folder in feeds_to_delete:
(folder_name == in_folder and deleted))): feeds_to_delete.remove(folder)
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)
elif isinstance(folder, dict): elif isinstance(folder, dict):
for f_k, f_v in folder.items(): for f_k, f_v in folder.items():
nf = _find_folder_in_folders(f_v, f_k, multiples_found, deleted) if f_k == folder_to_delete and folder_name == in_folder:
new_folders.append({f_k: nf}) 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 = 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.folders = json.encode(user_sub_folders)
self.save() self.save()
UserSubscription.objects.filter(user=self.user, feed__in=feeds_to_delete).delete()
class Feature(models.Model): class Feature(models.Model):
""" """

View file

@ -494,11 +494,13 @@ def delete_feed(request):
def delete_folder(request): def delete_folder(request):
folder_to_delete = request.POST['folder_name'] folder_to_delete = request.POST['folder_name']
in_folder = request.POST.get('in_folder', '') 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. # 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 = 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) return dict(code=1)

View file

@ -2623,7 +2623,7 @@ background: transparent;
.NB-menu-manage li { .NB-menu-manage li {
margin: 0 0 0 0; margin: 0 0 0 0;
padding: 5px 8px 5px 36px; padding: 0;
cursor: pointer; cursor: pointer;
clear: both; clear: both;
position: relative; position: relative;
@ -2686,6 +2686,10 @@ background: transparent;
text-shadow: 0 1px 0 #000; 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 { .NB-menu-manage .NB-disabled {
opacity: .4; opacity: .4;
cursor: default; cursor: default;
@ -2780,8 +2784,17 @@ background: transparent;
display: none; display: none;
} }
.NB-menu-manage .NB-menu-manage-feed .NB-menu-manage-image { .NB-menu-manage .NB-menu-manage-image {
/* margin-left: 18px; */ /* 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 { .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) { if (NEWSBLUR.Globals.is_authenticated) {
this.make_request('/reader/delete_folder', { this.make_request('/reader/delete_folder', {
'folder_name': folder_name, 'folder_name': folder_name,
'in_folder': in_folder 'in_folder': in_folder,
'feed_id': feeds
}, callback, null); }, callback, null);
} else { } else {
if ($.isFunction(callback)) callback(); if ($.isFunction(callback)) callback();

View file

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