* src/RelLib.py (MediaBase): Add base class for media references;

(BaseObject): Add has_handle_reference, remove_handle_references,
and replace_handle_reference methods; (SourceNote): Add
replace_source_references method; (People,Family,Event,MediaObject):
Add handle_reference methods.


svn: r4217
This commit is contained in:
Alex Roitman 2005-03-22 13:55:13 +00:00
parent 17fc1f1be1
commit 8f9092d8b1
2 changed files with 401 additions and 166 deletions

View File

@ -1,3 +1,10 @@
2005-03-22 Alex Roitman <shura@gramps-project.org>
* src/RelLib.py (MediaBase): Add base class for media references;
(BaseObject): Add has_handle_reference, remove_handle_references,
and replace_handle_reference methods; (SourceNote): Add
replace_source_references method; (People,Family,Event,MediaObject):
Add handle_reference methods.
2005-03-21 Julio Sanchez <jsanchez@users.sourceforge.net> 2005-03-21 Julio Sanchez <jsanchez@users.sourceforge.net>
* src/MergeData.py: further changes to adapt to new API * src/MergeData.py: further changes to adapt to new API

View File

@ -149,6 +149,110 @@ class BaseObject:
""" """
return [] return []
def has_handle_reference(self,classname,handle):
"""
Returns True if the object or any of its non-primary child objects
has reference to a given handle of given primary object type.
@param classname: The name of the primary object class.
@type classname: str
@param handle: The handle to be checked.
@type handle: str
@return: Returns whether the object or any of it's non-primary child objects has reference to this handle of this object type.
@rtype: bool
"""
# Run through its own items
if classname == 'Source' and isinstance(self,SourceNote):
if self.has_source_reference(handle):
return True
elif classname == 'MediaObject' and isinstance(self,MediaBase):
if self.has_media_reference(handle):
return True
else:
if handle in self.get_handleholder_list(classname):
return True
# Run through child objects
for obj in self.get_handleholder_child_list(classname):
if obj.has_handle_reference(classname,handle):
return True
return False
def remove_handle_references(self,classname,handle_list):
"""
Removes references to object handles in the list
in this object and all child objects.
@param classname: The name of the primary object class.
@type classname: str
@param handle_list: The list of handles to be removed.
@type handle_list: str
"""
# Run through its own items
if classname == 'Source' and isinstance(self,SourceNote):
self.remove_source_references(handle_list)
elif classname == 'MediaObject' and isinstance(self,MediaBase):
self.remove_media_references(handle_list)
else:
self._remove_handle_references(classname,handle_list)
# Run through child objects
for obj in self.get_handleholder_child_list(classname):
obj.remove_handle_references(classname,handle_list)
def replace_handle_reference(self,classname,old_handle,new_handle):
"""
Replaces references to source handles in the list
in this object and all child objects.
@param classname: The name of the primary object class.
@type classname: str
@param old_handle: The handle to be replaced.
@type old_handle: str
@param new_handle: The handle to replace the old one with.
@type new_handle: str
"""
# Run through its own items
if classname == 'Source' and isinstance(self,SourceNote):
self.replace_source_references(old_handle,new_handle)
elif classname == 'MediaObject' and isinstance(self,MediaBase):
self.replace_media_references(old_handle,new_handle)
else:
self._replace_handle_reference(classname,old_handle,new_handle)
# Run through child objects
for obj in self.get_handleholder_child_list(classname):
obj.replace_handle_reference(classname,old_handle,new_handle)
def _replace_handle_reference(self,classname,old_handle,new_handle):
pass
def _remove_handle_references(self,classname,handle_list):
pass
def get_handleholder_list(self,classname):
"""
Returns the list of all bjects referring to handles of a given type.
@param classname: The name of the primary object class.
@type classname: str
@return: Returns the list of all attributes referring to handles of this type.
@rtype: list
"""
return []
def get_handleholder_child_list(self,classname):
"""
Returns the list of child objects that may refer to handles of a given type.
@param classname: The name of the primary object class.
@type classname: str
@return: Returns the list of child objects that may refer to handles of this type.
@rtype: list
"""
return []
class PrimaryObject(BaseObject): class PrimaryObject(BaseObject):
""" """
The PrimaryObject is the base class for all primary objects in the The PrimaryObject is the base class for all primary objects in the
@ -293,7 +397,7 @@ class SourceNote(BaseObject):
to this source handle. to this source handle.
@param src_handle: The source handle to be checked. @param src_handle: The source handle to be checked.
@type src_ref: str @type src_handle: str
@return: Returns whether the object or any of it's child objects has reference to this source handle. @return: Returns whether the object or any of it's child objects has reference to this source handle.
@rtype: bool @rtype: bool
""" """
@ -323,6 +427,23 @@ class SourceNote(BaseObject):
for item in self.get_sourcref_child_list(): for item in self.get_sourcref_child_list():
item.remove_source_references(src_handle_list) item.remove_source_references(src_handle_list)
def replace_source_references(self,old_handle,new_handle):
"""
Replaces references to source handles in the list
in this object and all child objects.
@param old_handle: The source handle to be replaced.
@type old_handle: str
@param new_handle: The source handle to replace the old one with.
@type new_handle: str
"""
while old_handle in self.source_list:
ix = self.source_list.index(old_handle)
self.source_list[ix] = new_handle
for item in self.get_sourcref_child_list():
item.replace_source_references(old_handle,new_handle)
def set_source_reference_list(self,src_ref_list) : def set_source_reference_list(self,src_ref_list) :
""" """
Assigns the passed list to the object's list of source references. Assigns the passed list to the object's list of source references.
@ -401,6 +522,116 @@ class SourceNote(BaseObject):
"""Creates a unique instance of the current note""" """Creates a unique instance of the current note"""
self.note = Note(self.note.get()) self.note = Note(self.note.get())
class MediaBase(BaseObject):
"""
Base class for storing media references
"""
def __init__(self,source=None):
"""
Create a new MediaBase, copying from source if not None
@param source: Object used to initialize the new object
@type source: MediaBase
"""
if source:
self.media_list = [ MediaRef(mref) for mref in source.media_list ]
else:
self.media_list = []
def add_media_reference(self,media_ref):
"""
Adds a L{MediaRef} instance to the object's media list.
@param media_ref: L{MediaRef} instance to be added to the object's
media list.
@type media_ref: L{MediaRef}
"""
self.media_list.append(media_ref)
def get_media_list(self):
"""
Returns the list of L{MediaRef} instances associated with the object.
@returns: list of L{MediaRef} instances associated with the object
@rtype: list
"""
return self.media_list
def set_media_list(self,media_ref_list):
"""
Sets the list of L{MediaRef} instances associated with the object.
It replaces the previous list.
@param media_ref_list: list of L{MediaRef} instances to be assigned
to the object.
@type media_ref_list: list
"""
self.media_list = media_ref_list
def get_mediaref_child_list(self):
"""
Returns the list of child secondary objects that may refer media.
@return: Returns the list of child secondary child objects that may refer media.
@rtype: list
"""
return []
def has_media_reference(self,obj_handle) :
"""
Returns True if the object or any of it's child objects has reference
to this media object handle.
@param obj_handle: The media handle to be checked.
@type obj_handle: str
@return: Returns whether the object or any of it's child objects has reference to this media handle.
@rtype: bool
"""
for media_ref in self.media_list:
# Using direct access here, not the getter method -- efficiency!
if media_ref.ref == obj_handle:
return True
for item in self.get_mediaref_child_list():
if item.has_media_reference(obj_handle):
return True
return False
def remove_media_references(self,obj_handle_list):
"""
Removes references to all media handles in the list
in this object and all child objects.
@param obj_handle_list: The list of media handles to be removed.
@type obj_handle_list: list
"""
new_media_list = [ media_ref for media_ref in self.media_list \
if media_ref.ref not in obj_handle_list ]
self.media_list = new_media_list
for item in self.get_mediaref_child_list():
item.remove_media_references(obj_handle_list)
def replace_media_references(self,old_handle,new_handle):
"""
Replaces references to media handles in the list
in this object and all child objects.
@param old_handle: The media handle to be replaced.
@type old_handle: str
@param new_handle: The media handle to replace the old one with.
@type new_handle: str
"""
while old_handle in self.media_list:
ix = self.media_list.index(old_handle)
self.media_list[ix] = new_handle
for item in self.get_mediaref_child_list():
item.replace_media_references(old_handle,new_handle)
class DataObj(SourceNote): class DataObj(SourceNote):
""" """
Base class for data elements, providing source, note, and privacy data Base class for data elements, providing source, note, and privacy data
@ -440,7 +671,7 @@ class DataObj(SourceNote):
""" """
return self.private return self.private
class Person(PrimaryObject,DataObj): class Person(PrimaryObject,DataObj,MediaBase):
""" """
Introduction Introduction
============ ============
@ -486,11 +717,11 @@ class Person(PrimaryObject,DataObj):
PrimaryObject.__init__(self) PrimaryObject.__init__(self)
DataObj.__init__(self) DataObj.__init__(self)
SourceNote.__init__(self) SourceNote.__init__(self)
MediaBase.__init__(self)
self.primary_name = Name() self.primary_name = Name()
self.event_list = [] self.event_list = []
self.family_list = [] self.family_list = []
self.parent_family_list = [] self.parent_family_list = []
self.media_list = []
self.nickname = "" self.nickname = ""
self.alternate_names = [] self.alternate_names = []
self.gender = Person.UNKNOWN self.gender = Person.UNKNOWN
@ -552,6 +783,62 @@ class Person(PrimaryObject,DataObj):
self.lds_seal, self.complete, self.source_list, self.note, self.lds_seal, self.complete, self.source_list, self.note,
self.change,self.private) = (data + (False,))[0:23] self.change,self.private) = (data + (False,))[0:23]
def _remove_handle_references(self,classname,handle_list):
if classname == 'Event':
new_list = [ handle for handle in self.event_list \
if handle not in handle_list ]
self.event_list = new_list
if self.death_handle and self.death_handle in handle_list:
self.death_handle = None
if self.birth_handle and self.birth_handle in handle_list:
self.birth_handle = None
elif classname == 'Family':
new_list = [ handle for handle in self.family_list \
if handle not in handle_list ]
self.family_list = new_list
new_list = [ item for item in self.parent_family_list \
if item[0] not in handle_list ]
self.parent_family_list = new_list
def _replace_handle_reference(self,classname,old_handle,new_handle):
if classname == 'Event':
while old_handle in self.event_list:
ix = self.event_list.index(old_handle)
self.event_list[ix] = new_handle
if self.death_handle and self.death_handle == old_handle:
self.death_handle = new_handle
if self.birth_handle and self.birth_handle == old_handle:
self.birth_handle = new_handle
elif classname == 'Family':
while old_handle in self.family_list:
ix = self.family_list.index(old_handle)
self.family_list[ix] = new_handle
new_list = []
for item in self.parent_family_list:
if item[0] == old_handle:
new_list.append((new_handle,item[1],item[2]))
else:
new_list.append(item)
self.parent_family_list = new_list
def get_handleholder_list(self,classname):
"""
Returns the list of all objects referring to handles of a given type.
@param classname: The name of the primary object class.
@type classname: str
@return: Returns the list of all attributes referring to handles of this type.
@rtype: list
"""
if classname == 'Event':
check_list = [self.birth_handle,self.death_handle]
add_list = [item for item in check_list if item]
return self.event_list + check_list
elif classname == 'Family':
return self.family_list + \
[item[0] for item in self.parent_family_list ]
def get_text_data_list(self): def get_text_data_list(self):
""" """
Returns the list of all textual attributes of the object. Returns the list of all textual attributes of the object.
@ -781,36 +1068,6 @@ class Person(PrimaryObject,DataObj):
""" """
return self.death_handle return self.death_handle
def add_media_reference(self,media_ref):
"""
Adds a L{MediaRef} instance to the Person's media list.
@param media_ref: L{MediaRef} instance to be added to the Person's
media list.
@type media_ref: L{MediaRef}
"""
self.media_list.append(media_ref)
def get_media_list(self):
"""
Returns the list of L{MediaRef} instances associated with the Person
@returns: list of L{MediaRef} instances associated with the Person
@rtype: list
"""
return self.media_list
def set_media_list(self,media_ref_list):
"""
Sets the list of L{MediaRef} instances associated with the Person.
It replaces the previous list.
@param media_ref_list: list of L{MediaRef} instances to be assigned
to the Person.
@type media_ref_list: list
"""
self.media_list = media_ref_list
def add_event_handle(self,event_handle): def add_event_handle(self,event_handle):
""" """
Adds the L{Event} to the Person instance's L{Event} list. This is Adds the L{Event} to the Person instance's L{Event} list. This is
@ -1220,7 +1477,7 @@ class Person(PrimaryObject,DataObj):
""" """
return self.lds_seal return self.lds_seal
class Family(PrimaryObject,SourceNote): class Family(PrimaryObject,SourceNote,MediaBase):
""" """
Introduction Introduction
============ ============
@ -1256,12 +1513,12 @@ class Family(PrimaryObject,SourceNote):
""" """
PrimaryObject.__init__(self) PrimaryObject.__init__(self)
SourceNote.__init__(self) SourceNote.__init__(self)
MediaBase.__init__(self)
self.father_handle = None self.father_handle = None
self.mother_handle = None self.mother_handle = None
self.child_list = [] self.child_list = []
self.type = Family.MARRIED self.type = Family.MARRIED
self.event_list = [] self.event_list = []
self.media_list = []
self.attribute_list = [] self.attribute_list = []
self.lds_seal = None self.lds_seal = None
self.complete = 0 self.complete = 0
@ -1298,6 +1555,50 @@ class Family(PrimaryObject,SourceNote):
self.media_list, self.attribute_list, self.lds_seal, self.media_list, self.attribute_list, self.lds_seal,
self.complete, self.source_list, self.note, self.change) = data self.complete, self.source_list, self.note, self.change) = data
def _remove_handle_references(self,classname,handle_list):
if classname == 'Event':
new_list = [ handle for handle in self.event_list \
if handle not in handle_list ]
self.event_list = new_list
elif classname == 'Person':
new_list = [ handle for handle in self.child_list \
if handle not in handle_list ]
self.child_list = new_list
if self.father_handle in handle_list:
self.father_handle = None
if self.mother_handle in handle_list:
self.mother_handle = None
def _replace_handle_reference(self,classname,old_handle,new_handle):
if classname == 'Event':
while old_handle in self.event_list:
ix = self.event_list.index(old_handle)
self.event_list[ix] = new_handle
elif classname == 'Person':
while old_handle in self.child_list:
ix = self.child_list.index(old_handle)
self.child_list[ix] = new_handle
if self.father_handle == old_handle:
self.father_handle = new_handle
if self.mother_handle == old_handle:
self.mother_handle = new_handle
def get_handleholder_list(self,classname):
"""
Returns the list of all objects referring to handles of a given type.
@param classname: The name of the primary object class.
@type classname: str
@return: Returns the list of all attributes referring to handles of this type.
@rtype: list
"""
if classname == 'Event':
return self.event_list
elif classname == 'Person':
check_list = [self.father_handle,self.mother_handle]
add_list = [item for item in check_list if item]
return self.child_list + add_list
def get_text_data_child_list(self): def get_text_data_child_list(self):
""" """
Returns the list of child objects that may carry textual data. Returns the list of child objects that may carry textual data.
@ -1563,37 +1864,7 @@ class Family(PrimaryObject,SourceNote):
""" """
self.event_list = event_list self.event_list = event_list
def add_media_reference(self,media_ref): class Event(PrimaryObject,DataObj,MediaBase):
"""
Adds a L{MediaRef} instance to the Family's media list.
@param media_ref: L{MediaRef} instance to be added to the Family's
media list.
@type media_ref: L{MediaRef}
"""
self.media_list.append(media_ref)
def get_media_list(self):
"""
Returns the list of L{MediaRef} instances associated with the Family
@returns: list of L{MediaRef} instances associated with the Family
@rtype: list
"""
return self.media_list
def set_media_list(self,media_ref_list):
"""
Sets the list of L{MediaRef} instances associated with the Person.
It replaces the previous list.
@param media_ref_list: list of L{MediaRef} instances to be assigned
to the Person.
@type media_ref_list: list
"""
self.media_list = media_ref_list
class Event(PrimaryObject,DataObj):
""" """
Introduction Introduction
============ ============
@ -1615,6 +1886,7 @@ class Event(PrimaryObject,DataObj):
PrimaryObject.__init__(self,source) PrimaryObject.__init__(self,source)
DataObj.__init__(self,source) DataObj.__init__(self,source)
MediaBase.__init__(self,source)
if source: if source:
self.place = source.place self.place = source.place
@ -1622,7 +1894,6 @@ class Event(PrimaryObject,DataObj):
self.description = source.description self.description = source.description
self.name = source.name self.name = source.name
self.cause = source.cause self.cause = source.cause
self.media_list = [MediaRef(media_id) for media_id in source.media_list]
if source.witness != None: if source.witness != None:
self.witness = source.witness[:] self.witness = source.witness[:]
else: else:
@ -1634,7 +1905,6 @@ class Event(PrimaryObject,DataObj):
self.name = "" self.name = ""
self.cause = "" self.cause = ""
self.witness = None self.witness = None
self.media_list = []
def serialize(self): def serialize(self):
""" """
@ -1670,6 +1940,38 @@ class Event(PrimaryObject,DataObj):
self.place, self.cause, self.private, self.source_list, self.place, self.cause, self.private, self.source_list,
self.note, self.witness, self.media_list, self.change) = data self.note, self.witness, self.media_list, self.change) = data
def _remove_handle_references(self,classname,handle_list):
if classname == 'Person' and self.witness:
new_list = [ witness for witness in self.witness \
if witness.type == ID and \
witness.val not in handle_list ]
self.witness = new_list
elif classname == 'Place' and self.place in handle_list:
self.place = u''
def _replace_handle_reference(self,classname,old_handle,new_handle):
if classname == 'Person' and self.witness:
for witness in self.witness:
if witness.type == ID and witness.val == old_handle:
witness.val = new_hanlde
elif classname == 'Place' and self.place == old_handle:
self.place = new_handle
def get_handleholder_list(self,classname):
"""
Returns the list of all objects referring to handles of a given type.
@param classname: The name of the primary object class.
@type classname: str
@return: Returns the list of all attributes referring to handles of this type.
@rtype: list
"""
if classname == 'Place':
return [self.place]
elif classname == 'Person' and self.witness:
return [ witness.val for witness in self.witness \
if witness.type == ID ]
def get_text_data_list(self): def get_text_data_list(self):
""" """
Returns the list of all textual attributes of the object. Returns the list of all textual attributes of the object.
@ -1702,36 +2004,6 @@ class Event(PrimaryObject,DataObj):
""" """
return self.media_list return self.media_list
def add_media_reference(self,media_ref):
"""
Adds a L{MediaRef} instance to the object's media list.
@param media_ref: L{MediaRef} instance to be added to the object's
media list.
@type media_ref: L{MediaRef}
"""
self.media_list.append(media_ref)
def get_media_list(self):
"""
Returns the list of media references associated with the object.
@return: Returns the list of L{MediaRef} objects assocated with
the object.
@rtype: list
"""
return self.media_list
def set_media_list(self,media_list):
"""
Assigns the passed list to the Event's list of media references.
@param media_list: List of media references to ba associated
with the Event
@type media_list: list of L{MediaRef} instances
"""
self.media_list = media_list
def get_witness_list(self): def get_witness_list(self):
""" """
Returns the list of L{Witness} instances associated with the Event. Returns the list of L{Witness} instances associated with the Event.
@ -1960,7 +2232,7 @@ class Event(PrimaryObject,DataObj):
""" """
self.date = date self.date = date
class Place(PrimaryObject,SourceNote): class Place(PrimaryObject,SourceNote,MediaBase):
""" """
Contains information related to a place, including multiple address Contains information related to a place, including multiple address
information (since place names can change with time), longitude, latitude, information (since place names can change with time), longitude, latitude,
@ -1976,6 +2248,7 @@ class Place(PrimaryObject,SourceNote):
""" """
PrimaryObject.__init__(self,source) PrimaryObject.__init__(self,source)
SourceNote.__init__(self,source) SourceNote.__init__(self,source)
MediaBase.__init__(self,source)
if source: if source:
self.long = source.long self.long = source.long
self.lat = source.lat self.lat = source.lat
@ -1987,9 +2260,6 @@ class Place(PrimaryObject,SourceNote):
self.urls = [] self.urls = []
for u in source.urls: for u in source.urls:
self.urls.append(Url(u)) self.urls.append(Url(u))
self.media_list = []
for media_id in source.media_list:
self.media_list.append(MediaRef(media_id))
else: else:
self.long = "" self.long = ""
self.lat = "" self.lat = ""
@ -1997,7 +2267,6 @@ class Place(PrimaryObject,SourceNote):
self.main_loc = None self.main_loc = None
self.alt_loc = [] self.alt_loc = []
self.urls = [] self.urls = []
self.media_list = []
def serialize(self): def serialize(self):
""" """
@ -2201,36 +2470,6 @@ class Place(PrimaryObject,SourceNote):
if location not in self.alt_loc: if location not in self.alt_loc:
self.alt_loc.append(location) self.alt_loc.append(location)
def add_media_reference(self,media_ref):
"""
Adds a L{MediaRef} instance to the object's media list.
@param media_ref: L{MediaRef} instance to be added to the objects's
media list.
@type media_ref: L{MediaRef}
"""
self.media_list.append(media_ref)
def get_media_list(self):
"""
Returns the list of L{MediaRef} instances associated with the object
@returns: list of L{MediaRef} instances associated with the object
@rtype: list
"""
return self.media_list
def set_media_list(self,media_ref_list):
"""
Sets the list of L{MediaRef} instances associated with the object.
It replaces the previous list.
@param media_ref_list: list of L{MediaRef} instances to be assigned
to the object.
@type media_ref_list: list
"""
self.media_list = media_ref_list
def get_display_info(self): def get_display_info(self):
"""Gets the display information associated with the object. This includes """Gets the display information associated with the object. This includes
the information that is used for display and for sorting. Returns a list the information that is used for display and for sorting. Returns a list
@ -2317,6 +2556,26 @@ class MediaObject(PrimaryObject,SourceNote):
self.date, self.place) = data self.date, self.place) = data
def _remove_handle_references(self,classname,handle_list):
if classname == 'Place' and self.place in handle_list:
self.place = u''
def _replace_handle_reference(self,classname,old_handle,new_handle):
if classname == 'Place' and self.place == old_handle:
self.place = new_handle
def get_handleholder_list(self,classname):
"""
Returns the list of all objects referring to handles of a given type.
@param classname: The name of the primary object class.
@type classname: str
@return: Returns the list of all attributes referring to handles of this type.
@rtype: list
"""
if classname == 'Place':
return [self.place]
def get_text_data_list(self): def get_text_data_list(self):
""" """
Returns the list of all textual attributes of the object. Returns the list of all textual attributes of the object.
@ -2457,17 +2716,17 @@ class MediaObject(PrimaryObject,SourceNote):
def set_attribute_list(self,list): def set_attribute_list(self,list):
self.attrlist = list self.attrlist = list
class Source(PrimaryObject): class Source(PrimaryObject,MediaBase):
"""A record of a source of information""" """A record of a source of information"""
def __init__(self): def __init__(self):
"""creates a new Source instance""" """creates a new Source instance"""
PrimaryObject.__init__(self) PrimaryObject.__init__(self)
MediaBase.__init__(self)
self.title = "" self.title = ""
self.author = "" self.author = ""
self.pubinfo = "" self.pubinfo = ""
self.note = Note() self.note = Note()
self.media_list = []
self.datamap = {} self.datamap = {}
self.abbrev = "" self.abbrev = ""
@ -2543,36 +2802,6 @@ class Source(PrimaryObject):
for item in self.get_sourcref_child_list(): for item in self.get_sourcref_child_list():
item.remove_source_references(src_handle_list) item.remove_source_references(src_handle_list)
def add_media_reference(self,media_ref):
"""
Adds a L{MediaRef} instance to the object's media list.
@param media_ref: L{MediaRef} instance to be added to the objects's
media list.
@type media_ref: L{MediaRef}
"""
self.media_list.append(media_ref)
def get_media_list(self):
"""
Returns the list of L{MediaRef} instances associated with the object
@returns: list of L{MediaRef} instances associated with the object
@rtype: list
"""
return self.media_list
def set_media_list(self,media_ref_list):
"""
Sets the list of L{MediaRef} instances associated with the object.
It replaces the previous list.
@param media_ref_list: list of L{MediaRef} instances to be assigned
to the object.
@type media_ref_list: list
"""
self.media_list = media_ref_list
def get_data_map(self): def get_data_map(self):
"""Returns the data map of attributes for the source""" """Returns the data map of attributes for the source"""
return self.datamap return self.datamap
@ -3687,7 +3916,6 @@ class Name(DataObj):
""" """
self.date = date self.date = date
class Url(BaseObject): class Url(BaseObject):
"""Contains information related to internet Uniform Resource Locators, """Contains information related to internet Uniform Resource Locators,
allowing gramps to store information about internet resources""" allowing gramps to store information about internet resources"""