Browse Source

Improve new status API

Make sure state changes are only detected as such by sqlalchemy if they
are real changes
develop
Jonathan Golder 7 years ago
parent
commit
bf8e47f916
  1. 63
      lib/mysqlred.py
  2. 14
      lib/redpage.py

63
lib/mysqlred.py

@ -85,7 +85,54 @@ class Mysql(object):
suffix = "s"
return cls._tableprefix + name + cls._tablesuffix
def changedp(self):
return self in self.session.dirty
return self.session.is_modified(self)
class MutableSet(MutableSet):
"""
Extended version of the mutable set for our states
"""
def has(self, item):
"""
Check if item is in set
@param item Item to check
"""
return item in self
def add(self, item):
"""
Extended add method, which only result in changed object if there is
really an item added.
@param item Item to add
"""
if not item in self:
super().add(item)
def discard(self, item):
"""
Wrapper for extended remove below
@param item Item to discard
"""
self.remove(item)
def remove(self, item, weak=True ):
"""
Extended remove method, which only results in changed object if there
is really an item removed. Additionally, combine remove and discard!
@param item Item to remove/discard
@param weak Set to false to use remove, else discard behavior
"""
if item in self:
if weak:
super().discard(item)
else:
super().remove(item)
class ColumnList( list, MutableComposite ):
"""
@ -249,13 +296,25 @@ class MysqlRedPage( Mysql, Base ):
pageid = Column( Integer, unique=True, primary_key=True )
revid = Column( Integer, unique=True, nullable=False )
pagetitle = Column( String(255), nullable=False )
status = Column( MutableSet.as_mutable(Status(255)), nullable=True )
__status = Column( 'status', MutableSet.as_mutable(Status(255)), nullable=True )
redfams = relationship(
"MysqlRedFam", order_by=MysqlRedFam.famhash, back_populates="redpage",
collection_class=attribute_mapped_collection("famhash"))
@property
def status( self ):
"""
Current fam status
"""
return self.__status
@status.setter
def status( self, status ):
if status:
self.__status = MutableSet( status )
else:
self.__status = MutableSet()
Base.metadata.create_all(engine)

14
lib/redpage.py

@ -61,11 +61,11 @@ class RedPage( MysqlRedPage ):
self._page = page
super().__init__(
pageid=pageid,
revid=self.page._revid,
pagetitle=self.page.title(),
status=MutableSet() ) #TODO EMPTY MutableSet() necessary?
#~ self._status = set()
pageid=self._page.pageid,
revid=self._page._revid,
pagetitle=self._page.title(),
status=None
)
self.is_archive()
@ -95,9 +95,9 @@ class RedPage( MysqlRedPage ):
if( self.archive or ( u"/Archiv" in self.page.title() ) or
( "{{Archiv}}" in self.page.text ) or
( "{{Archiv|" in self.page.text ) ):
return True
self.status.add("archive")
else:
self.status.discard("archive")
return False
def is_parsing_needed( self ):

Loading…
Cancel
Save