예제 #1
0
파일: amendment.py 프로젝트: jean/nova-ideo
class Amendment(Commentable,
                CorrelableEntity,
                SearchableEntity,
                DuplicableEntity,
                PresentableEntity):
    """Amendment class"""

    icon = 'icon novaideo-icon icon-amendment'
    name = renamer()
    result_template = 'novaideo:views/templates/amendment_result.pt'
    author = SharedUniqueProperty('author')
    proposal = SharedUniqueProperty('proposal', 'amendments')

    def __init__(self, **kwargs):
        super(Amendment, self).__init__(**kwargs)
        self.explanations = PersistentDict()
        self.set_data(kwargs)

   # @region.cache_on_arguments() 
    def get_used_ideas(self):
        """Return used ideas"""

        result = []
        if not hasattr(self, 'explanations'):
            return result

        for explanation in self.explanations.values():
            if explanation['intention'] is not None:
                try:
                    result.extend(
                          Intention.get_explanation_ideas(
                             explanation['intention'])
                          )
                except Exception:
                    pass

        return list(set(result))

    @property
    def related_ideas(self):
        """Return added ideas"""

        result = []
        for explanation in self.explanations.values():
            if explanation['intention'] is not None:
                try:
                    result.extend(
                        Intention.get_explanation_data(
                            explanation['intention'])['related_ideas']
                        )
                except Exception:
                    pass

        return list(set(result))
class RegistrationApproval(PloneBaseTool, UniqueObject, SimpleItem):
    implements(IRegistrationApproval)

    id = 'wcc_membership_registration_approval'
    meta_type = 'WCC Registration Approval Tool'
    toolicon = 'skins/plone_images/site_icon.png'
    security = ClassSecurityInfo()

    def __init__(self):
        self._data = PersistentDict()
    
    def is_memberid_allowed(self, key):
        return not (key in self._data.keys())

    def values(self):
        for x in self._data.values():
            if not x.has_key('username'):
                x['username'] = x['email']
        return sorted(self._data.values(), key=(lambda x: x['username']))

    def add(self, key, data):
        if key in self._data.keys():
            raise ConflictError(u'User already exist in pending')
        data['username'] = key
        self._data[key] = data
        notify(UserRegisteredEvent(data))

    def get(self, key):
        return self._data[key]

    def approve(self, key):
        if key not in self._data.keys():
            raise KeyError(key)

        portal = getSite()
        registration = getToolByName(self, 'portal_registration')
        portal_props = getToolByName(self, 'portal_properties')
        mt = getToolByName(self, 'portal_membership')
        props = portal_props.site_properties
        use_email_as_login = props.getProperty('use_email_as_login')

        data = self._data[key]

        if use_email_as_login:
            data['username'] = data['email']

        user_id = data['username']
        password = registration.generatePassword()
        request = getRequest()
        try:
            registration.addMember(user_id, password, REQUEST=request)
        except (AttributeError, ValueError), err:
            logging.exception(err)
            IStatusMessage(request).addStatusMessage(err, type="error")
            return

        # set additional properties using the user schema adapter
        schema = getUtility(IUserDataSchemaProvider).getSchema()

        adapter = getAdapter(portal, schema)
        adapter.context = mt.getMemberById(user_id)

        for name in getFieldNamesInOrder(schema):
            if name in data:
                setattr(adapter, name, data[name])

        notify(UserApprovedEvent(data)) 
        del self._data[key]
예제 #3
0
class OrderStorage(BTreeContainer):

    def __init__(self):
        super(OrderStorage, self).__init__()
        self.indexes = PersistentDict({
            'products': KeywordIndex(),
            'user_id': FieldIndex(),
            'processor_order_id': FieldIndex(),
            'finance_state': FieldIndex(),
            'fulfillment_state': FieldIndex(),
            'creation_date': FieldIndex(),
            'renewal_date': FieldIndex()
            }
        )

    def query(self, **args):
        results = self.apply(args)
        return ResultSet(results, self)

    def apply(self, query):
        results = []
        for index_name, index_query in query.items():
            index = self.indexes.get(index_name)
            if index is None:
                continue
            r = index.apply(index_query)
            if r is None:
                continue
            if not r:
                # empty results
                return r
            results.append((len(r), r))

        if not results:
            # no applicable indexes, so catalog was not applicable
            return None

        results.sort()  # order from smallest to largest

        _, result = results.pop(0)
        for _, r in results:
            _, result = weightedIntersection(result, r)

        return result

    def __setitem__(self, key, object):
        super(OrderStorage, self).__setitem__(key, object)
        self.index(object)

    def reset_index(self):
        # reindex all orders
        for index in self.indexes.values():
            index.clear()
        for order in self.values():
            self.index(order)

    def reindex(self, object):
        self.unindex(object.order_id)
        self.index(object)

    def index(self, object):
        doc_id = int(object.order_id)
        for attr, index in self.indexes.items():
            value = getattr(object, attr, None)
            if callable(value):
                value = value()
            if value is None:
                continue
            index.index_doc(doc_id, value)

    def unindex(self, order_id):
        for index in self.indexes.values():
            index.unindex_doc(int(order_id))

    def __delitem__(self, key):
        super(OrderStorage, self).__delitem__(key)
        doc_id = int(key)
        self.unindex(doc_id)
예제 #4
0
class Amendment(CorrelableEntity, SearchableEntity, DuplicableEntity,
                PresentableEntity, Debatable):
    """Amendment class"""

    type_title = _('Amendment')
    icon = 'icon novaideo-icon icon-amendment'
    name = renamer()
    templates = {
        'default': 'novaideo:views/templates/amendment_result.pt',
        'popover': 'novaideo:views/templates/amendment_popover.pt',
        'bloc': 'novaideo:views/templates/amendment_bloc.pt'
    }
    author = SharedUniqueProperty('author')
    proposal = SharedUniqueProperty('proposal', 'amendments')
    attached_files = SharedMultipleProperty('attached_files')

    def __init__(self, **kwargs):
        super(Amendment, self).__init__(**kwargs)
        self.explanations = PersistentDict()
        self.set_data(kwargs)
        self.addtoproperty('channels', Channel())

    @property
    def is_published(self):
        return 'submitted' in self.state

    @property
    def working_group(self):
        return self.proposal.working_group

    @property
    def authors(self):
        return [self.author]

    @property
    def challenge(self):
        return getattr(self.proposal, 'challenge', None)

    def _init_presentation_text(self):
        self._presentation_text = html_to_text(getattr(self, 'text', ''))

    def __setattr__(self, name, value):
        super(Amendment, self).__setattr__(name, value)
        if name == 'text':
            self._init_presentation_text()

    def presentation_text(self, nb_characters=400):
        text = getattr(self, '_presentation_text', None)
        if text is None:
            self._init_presentation_text()
            text = getattr(self, '_presentation_text', '')

        return truncate_text(text, nb_characters)

# @region.cache_on_arguments()

    def get_used_ideas(self):
        """Return used ideas"""

        result = []
        if not hasattr(self, 'explanations'):
            return result

        for explanation in self.explanations.values():
            if explanation['intention'] is not None:
                try:
                    result.extend(
                        Intention.get_explanation_ideas(
                            explanation['intention']))
                except Exception:
                    pass

        return list(set(result))

    @property
    def related_ideas(self):
        """Return added ideas"""

        result = []
        for explanation in self.explanations.values():
            if explanation['intention'] is not None:
                try:
                    result.extend(
                        Intention.get_explanation_data(
                            explanation['intention'])['related_ideas'])
                except Exception:
                    pass

        return list(set(result))
class RegistrationApproval(PloneBaseTool, UniqueObject, SimpleItem):
    implements(IRegistrationApproval)

    id = 'wcc_minisites_registration_approval'
    meta_type = 'WCC Minisite Approval Tool'
    toolicon = 'skins/plone_images/site_icon.png'
    security = ClassSecurityInfo()

    def __init__(self):
        self._data = PersistentDict()

    def is_memberid_allowed(self, key):
        return not (key in self._data.keys())

    def values(self):
        for x in self._data.values():
            if not x.has_key('username'):
                x['username'] = x['email']
        return sorted(self._data.values(), key=(lambda x: x['username']))

    def add(self, key, data):
        if key in self._data.keys():
            raise ConflictError(u'User already exist in pending')
        data['username'] = key
        self._data[key] = data
        notify(UserRegisteredEvent(data))

    def get(self, key):
        return self._data[key]

    def approve(self, key):
        if key not in self._data.keys():
            raise KeyError(key)

        portal = getSite()
        registration = getToolByName(self, 'portal_registration')
        portal_props = getToolByName(self, 'portal_properties')
        mt = getToolByName(self, 'portal_membership')
        props = portal_props.site_properties
        use_email_as_login = props.getProperty('use_email_as_login')

        data = self._data[key]

        if use_email_as_login:
            data['username'] = data['email']

        user_id = data['username']
        password = registration.generatePassword()
        request = getRequest()
        try:
            registration.addMember(user_id, password, REQUEST=request)
        except (AttributeError, ValueError), err:
            logging.exception(err)
            IStatusMessage(request).addStatusMessage(err, type="error")
            return

        # set additional properties using the user schema adapter
        schema = getUtility(IUserDataSchemaProvider).getSchema()

        adapter = getAdapter(portal, schema)
        adapter.context = mt.getMemberById(user_id)

        for name in getFieldNamesInOrder(schema):
            if name in data:
                setattr(adapter, name, data[name])

        notify(UserApprovedEvent(data))
        del self._data[key]
예제 #6
0
class VideoContainer(PersistentMapping):
    """ A simple container for Video objects
        
        >>> from mint.repoze.interfaces import IVideoContainer
        >>> from mint.repoze.models import VideoContainer, Video
        >>> ob = VideoContainer()
        >>> IVideoContainer.providedBy(ob)
        True
        >>> len(ob)
        0
        >>> ob[u'vid1'] = Video('vid1', 'Video 1', 'description', [])
        >>> len(ob)
        1
        >>> ob.keys()
        [u'vid1']
        
    """
    __acl__ = [
            (Allow, Everyone, 'view'),
            (Allow, 'admin', 'add'),
            (Allow, 'admin', 'edit'),
            ]
    
    implements(IVideoContainer,ILocation)
    
    encode_dir = 'var/videos/'
    
    def __init__(self, *args, **kwargs):
        self.data = PersistentDict()
        for data in args:
            self.add_video(*data)
        for v in kwargs.values():
            pass
    
    def __getitem__(self, key):
        return self.data.__getitem__(key)
    
    def __setitem__(self, key, value):
        return self.data.__setitem__(key, value)
    
    def items(self):
        return self.data.items()
    
    def keys(self):
        return self.data.keys()
    
    def values(self):
        return self.data.values()
    
    def __repr__(self):
        return u'<VideoContainer object>'
    
    def add_video(self, name, description, tags, encodes={}):
        uid = name.lower().replace(' ', '_')
        counter = 1
        while uid in self:
            uid = '%s_%03d' % (uid, counter)
            counter += 1
        self.data[uid] = Video(uid, name, description, tags, encodes, self.encode_dir)
        import transaction
        transaction.commit()
    
    def get_videos_by_tag(self, tag):
        """ Returns a list of video objects with the given tag
            >>> from mint.repoze.test.data import video_container
            >>> video_container.get_videos_by_tag('feature') # doctest: +ELLIPSIS
            [<Video name=...]
        """
        return [video for video in self.data.values() if tag in video.tags]
예제 #7
0
class Amendment(CorrelableEntity,
                SearchableEntity,
                DuplicableEntity,
                PresentableEntity,
                Debatable):
    """Amendment class"""

    type_title = _('Amendment')
    icon = 'icon novaideo-icon icon-amendment'
    name = renamer()
    templates = {
        'default': 'novaideo:views/templates/amendment_result.pt',
        'popover': 'novaideo:views/templates/amendment_popover.pt',
        'bloc': 'novaideo:views/templates/amendment_bloc.pt'
    }
    author = SharedUniqueProperty('author')
    proposal = SharedUniqueProperty('proposal', 'amendments')
    attached_files = SharedMultipleProperty('attached_files')

    def __init__(self, **kwargs):
        super(Amendment, self).__init__(**kwargs)
        self.explanations = PersistentDict()
        self.set_data(kwargs)
        self.addtoproperty('channels', Channel())

    @property
    def is_published(self):
        return 'submitted' in self.state

    @property
    def working_group(self):
        return self.proposal.working_group

    @property
    def authors(self):
        return [self.author]

    @property
    def challenge(self):
        return getattr(self.proposal, 'challenge', None)

    def _init_presentation_text(self):
        self._presentation_text = html_to_text(
            getattr(self, 'text', ''))

    def __setattr__(self, name, value):
        super(Amendment, self).__setattr__(name, value)
        if name == 'text':
            self._init_presentation_text()

    def presentation_text(self, nb_characters=400):
        text = getattr(self, '_presentation_text', None)
        if text is None:
            self._init_presentation_text()
            text = getattr(self, '_presentation_text', '')

        return truncate_text(text, nb_characters)

   # @region.cache_on_arguments() 
    def get_used_ideas(self):
        """Return used ideas"""

        result = []
        if not hasattr(self, 'explanations'):
            return result

        for explanation in self.explanations.values():
            if explanation['intention'] is not None:
                try:
                    result.extend(
                          Intention.get_explanation_ideas(
                             explanation['intention'])
                          )
                except Exception:
                    pass

        return list(set(result))

    @property
    def related_ideas(self):
        """Return added ideas"""

        result = []
        for explanation in self.explanations.values():
            if explanation['intention'] is not None:
                try:
                    result.extend(
                        Intention.get_explanation_data(
                            explanation['intention'])['related_ideas']
                        )
                except Exception:
                    pass

        return list(set(result))
예제 #8
0
class UserProfile(grok.Model):
    grok.implements(IUserProfile, ILayout)

    # Derived stats    
    health = 0            # 1 Vitality = 10 health)
    armor = 0             # Toughness + Defense
    crit_chance = 0       # (Crit Chance = 5% + Precision / 21
    crit_dmg = 0          # (Crit Dmg = 150% + by Ferocity/15
    boon_duration = 0     # Increased by Concentration (15 = 1%)
    cond_duration = 0     # Increased by Expertise (15 = 1%)
    
    base_health = {'Warrior':9212, 'Necromancer':9212,
                   'Revenant':5922, 'Engineer':5922, 'Ranger':5922, 'Mesmer':5922,
                   'Guardian':1645, 'Thief':1645, 'Elementalist':1645 }
    
    stats = PersistentDict()
    runes = PersistentDict()
    buffs = PersistentList()
    
    selected_weapon = 0
    selected_traits = []
    characters = []
    selected = ''
    refresh = False
    skill_choices = None
    skill_choice = None
    gear = []
    trinkets = []
    amulet = []
    backpack = []
    aquatic = []
    game_modes = ["pve", "pvp", "wvw"]
    gmode = "wvw"
    spec_bg = grok.Container()
    grok.traversable('spec_bg')
    
    def __init__(self, user):
        location.locate(self.spec_bg, self, 'spec_bg')
        self.user = user
        
    def update(self):
        location.locate(self.spec_bg, self, 'spec_bg')
        account = GW2API().account(self.user.gw2_apikey)
        if account is not None:
            self.account = account
        characters = GW2API().characters(self.user.gw2_apikey)
        if characters is not None:
            self.characters = characters
#        self.refresh=True
        if len(self.selected)==0: 
            self.selected = self.characters[0]
            self.refresh = True
        if self.refresh:
            core = GW2API().character_core(self.user.gw2_apikey, self.selected)
            if core is not None: 
                self.core = core
#            self.equipment = GW2API().character_equipment(self.user.gw2_apikey, self.selected)
#            self.skills = GW2API().character_skills(self.user.gw2_apikey, self.selected)
#            self.specializations = GW2API().character_specializations(self.user.gw2_apikey, self.selected)
            self.refresh = False
            
        self.stats = PersistentDict({'Power': 1000, 'Precision': 1000, 'Toughness': 1000, 'Vitality':1000,
                                     'Defense':0, 'ConditionDamage': 0, 'CritDamage':0,
                                     'Concentration':0, 'Expertise':0, 'Ferocity':0, 'Healing':0,
                                     'BoonDuration':0, 'ConditionDuration':0
                                     })
        self.runes = PersistentDict()
        self.buffs = PersistentList()
        
        self.gear = self._gear()
        self.trinkets = self._trinkets()
        self.amulet = self._amulet()
        self.backpack = self._backpack()
        self.weapons = self._weapons()
        self.aquatic = self._aquatic()
        self.profession = GW2API().get_profession(self.core['profession'])
                
        self.skill_choices = None
        if self.profession['name'] == 'Elementalist':
            self.skill_choices = 'attunement'
            if self.skill_choice is None: self.skill_choice = 'Fire'
        
        self.prof_skills = self._profession_skills()
        self.weap_skills = self._weapon_skills()

        self.rune_bonuses = []
        for r in self.runes.values():
            b = r['rune']['bonuses'][:r['count']]
            for effect in b:
                self.rune_bonuses.append(effect)
                if effect.find(' to All Stats')>0:
                    perc = int(effect.split(' ')[0])
                    for stat in ['Power', 'Precision', 'Toughness', 'Vitality', 'Ferocity', 'Healing', 'ConditionDamage']:
                        self.stats[stat] += perc
                elif effect.find('% Boon Duration') > 0:
                    perc = int(effect.split('%')[0])
                    self.stats['BoonDuration'] += perc * 15
                elif self._stat_effect(effect):
                    pass
                else:
                    self.buffs.append(effect)

        self.health = self.stats['Vitality'] * 10 + self.base_health[self.core['profession']]
        self.armor = self.stats['Toughness'] + self.stats['Defense']
        self.crit_chance = (self.stats['Precision']-916) / 21.0
        self.crit_dmg = 150 + (self.stats['CritDamage'] + self.stats['Ferocity']) / 15.0
        self.boon_duration = (self.stats['BoonDuration'] + self.stats['Concentration']) / 15.0
        self.cond_duration = (self.stats['ConditionDuration'] + self.stats['Expertise']) / 15.0
        
#         for i in list(self.spec_bg.keys()):
#             del self.spec_bg[i]

        self.selected_traits = []
        for spec in self.specs():
            for t in spec['traits']:
                if 'description' in t:
                    self.buffs.append("%s - %s"%(t['name'], t['description']))
                else:
                    self.buffs.append(t['name'])            
            img = SpecImage(spec['id']['background'])
            if img.fn not in self.spec_bg.keys():
                img.retrieve()
                self.spec_bg[img.fn] = img
            spec['id']['img_no'] = img.fn
            self.selected_traits.extend([t['name'] for t in spec['traits']])
            
        
        pass

    def gear_title(self, gear):
        try:
            if 'stats' in gear:
                stats = [ "%s: +%s" % (n, s) for n, s in gear['stats']['attributes'].items()]
                return "\n".join(stats)
            else:
                attributes = gear['id']['details']['infix_upgrade']['attributes']
                return "\n".join(['%s: +%s' % (a['attribute'], a['modifier']) for a in attributes])
        except Exception, e:
            print "Cannot determine gear title for %s" % gear
            print "%s" % str(e)
        return ''
예제 #9
0
class BaseContainer(PersistentMapping):
    """ Provides a basis for `container` objects
        >>> container = BaseContainer()
        >>> container[u'foo'] = u'bar'
        >>> container[u'foo']
        u'bar'
        >>> container.items()
        [(u'foo', u'bar')]
        >>> container.keys()
        [u'foo']
        >>> container.values()
        [u'bar']
        
    """
    def __init__(self):
        self.data = PersistentDict()
    
    def __getitem__(self, key):
        return self.data.__getitem__(key)
    
    def __setitem__(self, key, value):
        """ Acts as a proxy to the self.data PersistentDict. As it is a
            persistent object, it will also try and assign the __parent__
            attrubute to any object stored through this interface.
            
            >>> container = BaseContainer()
            >>> container.__setitem__('foo', 'bar')
            >>> 'foo' in container.data
            True
            >>> container['foo'].__parent__ # doctest: +ELLIPSIS
            Traceback (most recent call last):
            ...
            AttributeError: 'str' object has no attribute '__parent__'
            >>> class Child(object):
            ...     __parent__ = None
            ...
            >>> container.__setitem__('baz', Child())
            >>> 'baz' in container.data
            True
            >>> container['baz'].__parent__ == container
            True
        """
        ret = self.data.__setitem__(key, value)
        try: self.data[key].__parent__ = self
        except: pass
        return ret
    
    def items(self):
        return self.data.items()
    
    def keys(self):
        return self.data.keys()
    
    def values(self):
        return self.data.values()
    
    def update(self, _data={}, **kwargs):
        """ BaseContainers can be updated much the same as any Python dictionary.
            
            By passing another mapping object:
            
            >>> container = BaseContainer()
            >>> container.update({'foo':'bar'})
            
            By passing a list of iterables with length 2:
            
            >>> container = BaseContainer()
            >>> container.update([('foo', 'bar'),])
            
            By passing a set of keyword arguments:
            
            >>> container = BaseContainer()
            >>> container.update(foo='bar')
            
        """
        if kwargs:
            for k,v in kwargs.items():
                self.__setitem__(k,v)
            return
        elif isinstance(_data, dict):
            for k,v in _data.items():
                self.__setitem__(k,v)
        elif isinstance(_data, dict):
            for k,v in _data:
                self.__setitem__(k,v)