From bf8e47f916ee632e5c4f56a6d1b1e2f69a84bb35 Mon Sep 17 00:00:00 2001 From: Jonathan Golder Date: Tue, 7 Mar 2017 10:55:44 +0100 Subject: [PATCH] Improve new status API Make sure state changes are only detected as such by sqlalchemy if they are real changes --- lib/mysqlred.py | 63 +++++++++++++++++++++++++++++++++++++++++++++++-- lib/redpage.py | 14 +++++------ 2 files changed, 68 insertions(+), 9 deletions(-) diff --git a/lib/mysqlred.py b/lib/mysqlred.py index 3710219..46fa811 100644 --- a/lib/mysqlred.py +++ b/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) diff --git a/lib/redpage.py b/lib/redpage.py index fa1c695..cba4268 100644 --- a/lib/redpage.py +++ b/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 ):