← Back to team overview

zeitgeist team mailing list archive

[Merge] lp:~zeitgeist/zeitgeist/move-event into lp:zeitgeist

 

Siegfried Gevatter has proposed merging lp:~zeitgeist/zeitgeist/move-event into lp:zeitgeist with lp:~zeitgeist/zeitgeist/dbschema4 as a prerequisite.

Requested reviews:
  Zeitgeist Framework Team (zeitgeist)

For more details, see:
https://code.launchpad.net/~zeitgeist/zeitgeist/move-event/+merge/53132
-- 
https://code.launchpad.net/~zeitgeist/zeitgeist/move-event/+merge/53132
Your team Zeitgeist Framework Team is requested to review the proposed merge of lp:~zeitgeist/zeitgeist/move-event into lp:zeitgeist.
=== modified file '_zeitgeist/engine/main.py'
--- _zeitgeist/engine/main.py	2011-03-12 15:58:33 +0000
+++ _zeitgeist/engine/main.py	2011-03-12 15:58:33 +0000
@@ -161,7 +161,7 @@
 	
 	def _get_subject_from_row(self, row):
 		subject = Subject()
-		for field in ("uri", "text", "storage"):
+		for field in ("uri", "text", "storage", "uri_current"):
 			setattr(subject, field, row["subj_" + field])
 		setattr(subject, "origin", row["subj_origin_uri"])
 		for field in ("interpretation", "manifestation", "mimetype"):
@@ -586,9 +586,10 @@
 		
 		# Make sure all URIs are inserted
 		_origin = [subject.origin for subject in event.subjects if subject.origin]
+		_uri_current = [subject.uri_current for subject in event.subjects if subject.uri_current]
 		self._cursor.execute("INSERT OR IGNORE INTO uri (value) %s"
-			% " UNION ".join(["SELECT ?"] * (len(event.subjects) + len(_origin))),
-			[subject.uri for subject in event.subjects] + _origin)
+			% " UNION ".join(["SELECT ?"] * (len(event.subjects) + len(_origin)+ len(_uri_current))),
+			[subject.uri for subject in event.subjects] + _origin + _uri_current)
 		
 		# Make sure all mimetypes are inserted
 		_mimetype = [subject.mimetype for subject in event.subjects \
@@ -635,16 +636,16 @@
 						None, # event origin
 						payload_id,
 						subject.uri,
-						subject.uri, # subj_id_current
+						subject.uri_current,
 						self._interpretation[subject.interpretation],
 						self._manifestation[subject.manifestation],
 						subject.origin,
 						self._mimetype[subject.mimetype],
 						subject.text,
 						subject.storage))
-				
+			
 			self.extensions.apply_post_insert(event, sender)
-				
+			
 		except sqlite3.IntegrityError:
 			# The event was already registered.
 			# Rollback _last_event_id and return the ID of the original event
@@ -659,6 +660,12 @@
 					self._actor[event.actor]))
 			return self._cursor.fetchone()[0]
 		
+		if event.interpretation == Interpretation.MOVE_EVENT:
+			for subject in event.subjects:
+				self._cursor.execute("""
+					UPDATE event SET subj_id_current=(SELECT id FROM uri WHERE value=?)
+					 WHERE subj_id_current=(SELECT id FROM uri WHERE value=?)
+						""", (subject.uri_current, subject.uri))
 		return id
 	
 	def _store_payload (self, event):

=== modified file '_zeitgeist/engine/sql.py'
--- _zeitgeist/engine/sql.py	2011-03-12 15:58:33 +0000
+++ _zeitgeist/engine/sql.py	2011-03-12 15:58:33 +0000
@@ -391,11 +391,15 @@
 				event.interpretation,
 				event.manifestation,
 				event.actor,
+				event.origin,
 				(SELECT value FROM payload WHERE payload.id=event.payload)
 					AS payload,
 				(SELECT value FROM uri WHERE uri.id=event.subj_id)
 					AS subj_uri,
 				event.subj_id, -- #this directly points to an id in the uri table
+				(SELECT value FROM uri WHERE uri.id=event.subj_id_current)
+					AS subj_uri_current,
+				event.subj_id_current, -- #this directly points to an id in the uri table
 				event.subj_interpretation,
 				event.subj_manifestation,
 				event.subj_origin,

=== modified file 'extra/ontology/zg.trig'
--- extra/ontology/zg.trig	2011-02-09 11:18:39 +0000
+++ extra/ontology/zg.trig	2011-03-12 15:58:33 +0000
@@ -47,7 +47,7 @@
         a rdfs:Class ;
         rdfs:comment "Event triggered because a resource has been deleted or otherwise made permanently unavailable. Fx. when deleting a file. FIXME: How about when moving to trash?" ;
         rdfs:subClassOf zg:EventInterpretation .
-        
+    
     zg:ReceiveEvent
         a rdfs:Class ;
         rdfs:comment "Event triggered when something is received from an external party. The event manifestation must be set according to the world view of the receiving party. Most often the item that is being received will be some sort of message - an email, instant message, or broadcasted media such as micro blogging" ;
@@ -72,6 +72,12 @@
         a rdfs:Class ;
         rdfs:comment "Event triggered when something expires or times out. These types of events are normally not triggered by the user, but by the operating system or some external party. Examples are a recurring calendar item or task deadline that expires or a when the user fails to respond to an external request such as a phone call" ;
         rdfs:subClassOf zg:EventInterpretation .
+        
+    zg:MoveEvent
+        a rdfs:Class ;
+        rdfs:comment "Event triggered when a resource has been moved from a location to another. Fx. moving a file from a folder to another.";
+        rdfs:subClassOf zg:EventInterpretation.
+        
     
 # manifestations
     

=== modified file 'test/engine-test.py'
--- test/engine-test.py	2011-03-04 16:46:04 +0000
+++ test/engine-test.py	2011-03-12 15:58:33 +0000
@@ -918,6 +918,19 @@
 			StorageState.Any, 2, 0),
 		self.assertEquals(result, (["i2", "i3", ],))
 		
+	def testSubjectUriCurrent(self):
+		subj = Subject.new_for_values(uri="http://x";)
+		event = Event.new_for_values(subjects=[subj])
+		ids1 = self.engine.insert_events([event])
+		
+		subj = Subject.new_for_values(uri="http://x";, uri_current="http://y";)
+		event = Event.new_for_values(interpretation=Interpretation.MOVE_EVENT, subjects=[subj])
+		ids2 = self.engine.insert_events([event])
+		
+		results = self.engine.get_events(ids1 + ids2)
+		self.assertEquals(subj.uri_current, results[0].subjects[0].uri_current)
+		self.assertEquals(subj.uri_current, results[1].subjects[0].uri_current)
+		
 
 class ResultTypeTest(_engineTestClass):
 	
@@ -1160,6 +1173,7 @@
 		events = self.engine.find_events(
 			TimeRange.always(), [], StorageState.Any, 0, ResultType.LeastPopularSubjectInterpretation)
 		self.assertEquals([e.timestamp for e in events], ['118', '106', '116', '119'])
+		
 
 class ZeitgeistEngineBugsTest(_engineTestClass):
 	

=== modified file 'zeitgeist/datamodel.py'
--- zeitgeist/datamodel.py	2011-01-17 15:54:47 +0000
+++ zeitgeist/datamodel.py	2011-03-12 15:58:33 +0000
@@ -445,10 +445,11 @@
 		Origin,
 		Mimetype,
 		Text,
-		Storage) = range(7)
+		Storage,
+		UriCurrent) = range(8)
 		
-	SUPPORTS_NEGATION = (Uri, Interpretation, Manifestation, Origin, Mimetype)
-	SUPPORTS_WILDCARDS = (Uri, Origin, Mimetype)
+	SUPPORTS_NEGATION = (Uri, UriCurrent, Interpretation, Manifestation, Origin, Mimetype)
+	SUPPORTS_WILDCARDS = (Uri, UriCurrent, Origin, Mimetype)
 	
 	def __init__(self, data=None):
 		super(Subject, self).__init__([""]*len(Subject.Fields))
@@ -473,6 +474,7 @@
 		to the keyword arguments passed to this method.
 		
 		:param uri: The URI of the subject. Eg. *file:///tmp/ratpie.txt*
+		:param uri_current: The current URI of the subject. Eg. *file:///tmp/ratpie.txt*
 		:param interpretation: The interpretation type of the subject, given either as a string URI or as a :class:`Interpretation` instance
 		:param manifestation: The manifestation type of the subject, given either as a string URI or as a :class:`Manifestation` instance
 		:param origin: The URI of the location where subject resides or can be found
@@ -482,7 +484,7 @@
 		"""
 		self = Subject()
 		for key, value in values.iteritems():
-			if not key in ("uri", "interpretation", "manifestation", "origin",
+			if not key in ("uri", "uri_current", "interpretation", "manifestation", "origin",
 						"mimetype", "text", "storage"):
 				raise ValueError("Subject parameter '%s' is not supported" %key)
 			setattr(self, key, value)
@@ -493,8 +495,20 @@
 		
 	def set_uri(self, value):
 		self[Subject.Uri] = value
+		if not self[Subject.UriCurrent] or self[Subject.UriCurrent].strip() == "":
+			self[Subject.UriCurrent] = value
 	uri = property(get_uri, set_uri,
 	doc="Read/write property with the URI of the subject encoded as a string")
+	
+	def get_uri_current(self):
+		if not self[Subject.UriCurrent] or self[Subject.UriCurrent].strip()=="":
+			return self[Subject.Uri]
+		return self[Subject.UriCurrent]
+		
+	def set_uri_current(self, value):
+		self[Subject.UriCurrent] = value
+	uri_current = property(get_uri_current, set_uri_current,
+	doc="Read/write property with the UriCurrent of the subject encoded as a string")
 		
 	def get_interpretation(self):
 		return self[Subject.Interpretation]
@@ -602,9 +616,10 @@
 		Timestamp,
 		Interpretation,
 		Manifestation,
-		Actor) = range(5)
+		Actor,
+		Origin) = range(6)
 		
-	SUPPORTS_NEGATION = (Interpretation, Manifestation, Actor)
+	SUPPORTS_NEGATION = (Interpretation, Manifestation, Actor, Origin)
 	SUPPORTS_WILDCARDS = (Actor,)
 	
 	def __init__(self, struct = None):
@@ -685,7 +700,8 @@
 		:param timestamp: Event timestamp in milliseconds since the Unix Epoch 
 		:param interpretaion: The Interpretation type of the event
 		:param manifestation: Manifestation type of the event
-		:param actor: The actor (application) that triggered the event
+		:param actor: The actor (application) that triggered the event		
+		:param origin: The origin (domain) where the event was triggered
 		:param subjects: A list of :class:`Subject` instances
 		
 		Instead of setting the *subjects* argument one may use a more
@@ -706,7 +722,7 @@
 		self = cls()
 		for key in values:
 			if not key in ("timestamp", "interpretation", "manifestation",
-				"actor", "subjects", "subject_uri", "subject_interpretation",
+				"actor", "origin", "subjects", "subject_uri", "subject_interpretation",
 				"subject_manifestation", "subject_origin", "subject_mimetype",
 				"subject_text", "subject_storage"):
 				raise ValueError("Event parameter '%s' is not supported" % key)
@@ -715,6 +731,7 @@
 		self.interpretation = values.get("interpretation", "")
 		self.manifestation = values.get("manifestation", "")
 		self.actor = values.get("actor", "")
+		self.origin = values.get("origin", "")
 		self.subjects = values.get("subjects", self.subjects)
 		
 		if self._dict_contains_subject_keys(values):
@@ -722,6 +739,7 @@
 				raise ValueError("Subject keys, subject_*, specified together with full subject list")
 			subj = Subject()
 			subj.uri = values.get("subject_uri", "")
+			subj.uri_current = values.get("subject_uri_current", "") or ""
 			subj.interpretation = values.get("subject_interpretation", "")
 			subj.manifestation = values.get("subject_manifestation", "")
 			subj.origin = values.get("subject_origin", "")
@@ -803,6 +821,14 @@
 	actor = property(get_actor, set_actor,
 	doc="Read/write property defining the application or entity responsible for emitting the event. For applications the format of this field is base filename of the corresponding .desktop file with an `app://` URI scheme. For example `/usr/share/applications/firefox.desktop` is encoded as `app://firefox.desktop`")
 	
+	def get_origin(self):
+		return self[0][Event.Origin]
+	
+	def set_origin(self, value):
+		self[0][Event.Origin] = value
+	origin = property(get_origin, set_origin,
+	doc="Read/write property defining the origin where the event was emitted.")
+	
 	def get_payload(self):
 		return self[2]
 	


Follow ups