def upgrade_visit_all_blogs(): from base import get_group_database, get_user_database, commit_upgraded_versioneds count = 0 item_count = 0 for group_id, group in get_group_database().root.iteritems(): for item in group.get_blog().get_items(): item_count += 1 for page_name, page in group.get_wiki().pages.iteritems(): for item in page.blog.get_items(): item_count += 1 count += 1 commit_upgraded_versioneds() print "Touched %d groups, %d items, %s" % (count, item_count, group_id) count = 0 item_count = 0 for user_id, user in get_user_database().root.iteritems(): for item in user.get_blog().get_items(): item_count += 1 if count % 500 == 0: print "Touched %d users, %d items" % (count, item_count) commit_upgraded_versioneds() count += 1 commit_upgraded_versioneds()
def flush_all_owners_data_cache(): """Flush all group owners' data caches.""" from base import get_group_database group_db = get_group_database() for group_id, group in group_db.root.iteritems(): for user in group.owners: flush_user_data_cache(user)
def new_user_from_email(self, email): """Create a new user with the given e-mail. Returns (User, password)""" from user import User from base import get_usergroup_database, get_group_database email = email.lower() user = User() password = user.new_user_from_email(email) user.add_to_group(get_usergroup_database()['users']) # check user id for uniqness FIXME should be in qon.user while self.has_key(user.get_user_id()) or self.retired_users.has_key(user.get_user_id()): user.generate_user_id() self.add_user(user) # join user to default group get_group_database().notify_new_user(user) return user, password
def upgradeFixInvitations(): """Remove any lingering invitations to users who are members of groups they are invited to.""" from base import get_group_database, get_user_database user_db = get_user_database() group_db = get_group_database() for user in user_db.root.values(): for g in group_db.users_groups(user): g.remove_invitation(user) group_db.invitations.remove_all_user_invitations(user, g)
def upgrade_blog_raw_text_format(): """Compress all blog item text fields.""" from base import get_group_database import transaction group_db = get_group_database() for g in group_db.root.values(): for bi in g.blog.get_items(): if not hasattr(bi, '_BlogItem__summary'): bi.set_summary(bi.get_summary()) bi._p_changed = 1 transaction.commit(True)
def check_items(): """Check that all reachable BlogItems have their parent_blogitem field correctly set.""" from base import get_group_database, get_user_database def check_item(): """Check if item is properly in its blog's item list.""" try: index = item.blog.item_index(item) except ValueError: print "ERROR: item /group/%s/%s not found in blog." % ( item.blog.ihb.get_user_id(), item) def check_comments(): comment_count = 0 for comment in item.get_all_comments(): if comment.parent_blogitem is not item: print "ERROR: /group/%s/%d/%d/ has invalid parent_blogitem." \ % (group_id, item_count, comment_count) comment_count += 1 count = 0 item_count = 0 for group_id, group in get_group_database().root.iteritems(): for item in group.get_blog().get_items(): item_count += 1 check_item() check_comments() for page_name, page in group.get_wiki().pages.iteritems(): for item in page.blog.get_items(): item_count += 1 check_item() check_comments() count += 1 print "Checked %d groups, %d items, %s" % (count, item_count, group_id) count = 0 item_count = 0 for user_id, user in get_user_database().root.iteritems(): for item in user.get_blog().get_items(): item_count += 1 check_item() check_comments() if count % 500 == 0: print "Checked %d users, %d items" % (count, item_count) count += 1 print "Checked %d users, %d items" % (count, item_count)
def upgradeFixMemberPerms(): """Fix duplicate permissions in member list perms.""" from base import get_group_database for g in get_group_database().root.values(): m = g.get_members() perms = m.get_perms() # new code will call unique_items on perms m.set_other_perms(perms[2]) m.set_group_perms(perms[1]) m.set_owner_perms(perms[0])
def cleanup_invitations(): """Remove duplicate and redundant invitations from global list and individual groups.""" from base import get_group_database, get_user_database def user_name(user_or_email): if isinstance(user_or_email, HasEmail): return user_or_email.display_name() else: return user_or_email group_db = get_group_database() user_db = get_user_database() # sanity check and clean each group's invitation list for g in group_db.root.values(): for user_or_email in g.invited_users.keys(): user = user_db.resolve_user(user_or_email) if user: if g.is_member(user) or g.is_owner(user): print "%s is already a member of %s, removing invitation." % ( user_name(user), g.name) g.remove_invitation(user_or_email) # check and clean global list for (email, invites) in group_db.invitations.root.iteritems(): user = user_db.resolve_user(email) if user: for group_id in invites: g = group_db[group_id] if g.is_member(user) or g.is_owner(user): print "%s is a member of %s, removing global invitation." % ( user_name(user), g.name) group_db.invitations.remove_all_user_invitations(user, g) # remove duplicate group entries in global list for (email, invites) in group_db.invitations.root.iteritems(): invites = qon.util.unique_items(invites) group_db.invitations.root[email] = invites
def upgradeAddInvitations(): from base import get_group_database, get_user_database from persistent.mapping import PersistentMapping user_db = get_user_database() db = get_group_database() db.invitations = Invitations() for g in db.root.values(): g.invited_users = PersistentMapping(g.invited_users) for email in g.invited_users.keys(): db.invitations.add_invitation(email, g) # remove lingering invitations from when our code was dumb and left them for g in db.root.values(): for email in g.invited_users.keys(): try: user = user_db.get_user_by_email(email) except KeyError: pass else: if g.is_member(user): del g.invited_users[email] db.invitations.remove_all_user_invitations(user, g)
def fix_broken_user_data_caches(): """Scans all users to check if any of their user data caches are inaccurate, or worse, reference deleted groups.""" from qon.base import get_user_database, get_group_database user_db = get_user_database() group_db = get_group_database() i = 0 for user_id, user in user_db.root.iteritems(): i += 1 # print "%d) %s" % (i, user_id) # check/fix owned groups if hasattr(user, '_group_owned_groups'): real_owned_groups = [group_db[group] for group in group_db.root.keys() \ if group_db[group].is_owner(user)] if real_owned_groups != user._group_owned_groups: print "%s's _group_owned_groups isn't accurate" % user_id for g in user._group_owned_groups: if not group_db.has_key(g.get_user_id()): print "-%s's _group_owned_groups references deleted group %s" % (user_id, g.get_user_id()) # fix it! user._group_owned_groups = real_owned_groups # check/fix member groups if hasattr(user, '_group_member_groups'): real_member_groups = [group_db[group] for group in group_db.root.keys() \ if group_db[group].is_member(user, slow=True)] if real_member_groups != user._group_member_groups: print "%s's _group_member_groups isn't accurate" % user_id for g in user._group_member_groups: if not group_db.has_key(g.get_user_id()): print "-%s's _group_member_groups references deleted group %s" % (user_id, g.get_user_id()) # fix it user._group_member_groups = real_member_groups
def flush_user_data_cache(user): from base import get_group_database get_group_database()._flush_user_data_caches(user)
def create_initial_groups(): """Create initial top-level groups if they don't already exist.""" from base import get_group_database, get_user_database import api # we want any groups we create in here to be active immediately save_min_sponsors = Group._min_sponsors Group._min_sponsors = 1 user_db = get_user_database() group_db = get_group_database() user_admin = user_db['admin'] def create_group(user_id, name, desc, owner, parent_id, join_pol, memb_vis, memb_edit=''): if not group_db.has_key(user_id): g = group_db.create_group(user_id=user_id, name=name, description=desc, owner=owner, no_pay=True) group_db.force_accept(g) if parent_id: group_db.join_group(g, group_db[parent_id], force=1) g = group_db[user_id] if join_pol: api.group_set_join_policy(user_admin, g, join_pol) if join_pol == 'open': # if membership is open, allow non-members to read api.group_set_other_perms(user_admin, g, 'ro') if memb_vis: api.group_set_membership_visible(user_admin, g, memb_vis) if desc: api.group_set_settings(user_admin, g, description=desc) if memb_edit: api.group_set_member_edit(user_admin, g, memb_edit) # set date of formation create = datetime(2004, 05, 10, 12, 0, 0) g.date = create groups = [ ('top', 'Top', 'This group contains the top-level groups.', user_admin, None, '', 'open', ''), ('regional', 'Regional', 'Contains groups with a regional focus.', user_admin, 'top', '', 'open', ''), ('orgs', 'Organizations', 'Contains categories of organizations.', user_admin, 'top', '', 'open', ''), ('community', 'Community', 'Contains groups that are focused or based on ned.com.', user_admin, 'top', '', 'open', ''), ('issues', 'Issues', 'Contains groups focused on particular issues.', user_admin, 'top', '', 'open', ''), ('general', 'General', 'Contains groups that don\'t belong in other categories.', user_admin, 'top', 'open', 'open', ''), ('general-other', 'General', 'Contains groups that don\'t belong in other categories.', user_admin, 'general', 'open', 'open', ''), ('help', 'Help', 'Contains site help.', user_admin, 'community', '', 'open', ''), ('community-general', 'Community - General', '', user_admin, 'community', 'open', 'open', 'member'), ('suggestions', 'Suggestions', 'For community suggestions.', user_admin, 'community-general', '', 'open', ''), ('public', 'Public sector', 'Groups operating in the public sector should join this group.', user_admin, 'orgs', 'open', 'open', 'member'), ('private', 'Private sector', 'Groups operating in the private sector should join this group.', user_admin, 'orgs', 'open', 'open', 'member'), ('social', 'Social sector', 'Groups operating in the social sector should join this group.', user_admin, 'orgs', 'open', 'open', 'member'), ('orgs-general', 'Organizations - General', "For organizations that don't fit in other categories.", user_admin, 'orgs', 'open', 'open', 'member'), ('issues-business', 'Business', '', user_admin, 'issues', 'open', 'open', 'member'), ('issues-cyf', 'Children - Youth - Families', '', user_admin, 'issues', 'open', 'open', 'member'), ('issues-education', 'Education', '', user_admin, 'issues', 'open', 'open', 'member'), ('issues-env', 'Environment - Conservation', '', user_admin, 'issues', 'open', 'open', 'member'), ('issues-health', 'Health Care', '', user_admin, 'issues', 'open', 'open', 'member'), ('issues-pol', 'Policy - Politics', '', user_admin, 'issues', 'open', 'open', 'member'), ('issues-religion', 'Religion', '', user_admin, 'issues', 'open', 'open', 'member'), ('issues-soc', 'Social Justice - Human Services', '', user_admin, 'issues', 'open', 'open', 'member'), ('issues-tech', 'Technology', '', user_admin, 'issues', 'open', 'open', 'member'), ('issues-general', 'Issues - General', '', user_admin, 'issues', 'open', 'open', 'member'), ('ned', '<ned> Network', '', user_admin, '', '', '', ''), ('ned-internal', 'Ned - Internal', '', user_admin, '', '', '', ''), ('sitedev', 'Site Development', '', user_admin, 'ned-internal', '', '', ''), ] for user_id, name, desc, owner, parent_id, join_pol, memb_vis, memb_edit in groups: create_group(user_id, name, desc, owner, parent_id, join_pol, memb_vis, memb_edit) # Help group g_help = group_db['help'] api.group_set_anon_read(user_admin, g_help, True) # ON groups g_on = group_db['ned'] group_db.join_group(g_on, group_db['private'], force=1) group_db.join_group(g_on, group_db['public'], force=1) group_db.join_group(g_on, group_db['social'], force=1) api.group_set_owners_by_user_id(user_admin, g_on, ['admin', 'jimc']) api.group_set_join_policy(user_admin, g_on, 'owner') api.group_set_invite_policy(user_admin, g_on, 'owner') api.group_set_membership_visible(user_admin, g_on, 'open') api.group_set_member_edit(user_admin, g_on, True) api.group_set_anon_read(user_admin, g_on, True) g_on_int = group_db['ned-internal'] api.group_set_owners_by_user_id(user_admin, g_on_int, ['admin', 'jimc']) api.group_set_join_policy(user_admin, g_on_int, 'owner') api.group_set_invite_policy(user_admin, g_on_int, 'owner') api.group_set_membership_visible(user_admin, g_on_int, 'member') api.group_set_member_edit(user_admin, g_on_int, True) api.group_set_anon_read(user_admin, g_on_int, False) g_sitedev = group_db['sitedev'] api.group_set_owners_by_user_id(user_admin, g_sitedev, ['admin', 'jimc']) Group._min_sponsors = save_min_sponsors