Nick Hall created a patch which adds bet6ter date validation, and Latitude/ Longitude validation.
svn: r17738
This commit is contained in:
parent
6c3013d764
commit
f3df3d4ece
@ -964,7 +964,7 @@ class EditExifMetadata(Gramplet):
|
|||||||
event_box.show()
|
event_box.show()
|
||||||
|
|
||||||
entry = ValidatableMaskedEntry()
|
entry = ValidatableMaskedEntry()
|
||||||
entry.connect('validate', self.validate, widget)
|
entry.connect('validate', self.validate_datetime, widget)
|
||||||
entry.connect('content-changed', self.set_datetime, widget)
|
entry.connect('content-changed', self.set_datetime, widget)
|
||||||
event_box.add(entry)
|
event_box.add(entry)
|
||||||
self.exif_widgets[widget] = entry
|
self.exif_widgets[widget] = entry
|
||||||
@ -1007,7 +1007,8 @@ class EditExifMetadata(Gramplet):
|
|||||||
vbox2.pack_start(event_box, expand =False, fill =False, padding =0)
|
vbox2.pack_start(event_box, expand =False, fill =False, padding =0)
|
||||||
event_box.show()
|
event_box.show()
|
||||||
|
|
||||||
entry = gtk.Entry(max =50)
|
entry = ValidatableMaskedEntry()
|
||||||
|
entry.connect('validate', self.validate_coordinate, widget)
|
||||||
event_box.add(entry)
|
event_box.add(entry)
|
||||||
self.exif_widgets[widget] = entry
|
self.exif_widgets[widget] = entry
|
||||||
entry.show()
|
entry.show()
|
||||||
@ -1116,13 +1117,24 @@ class EditExifMetadata(Gramplet):
|
|||||||
else:
|
else:
|
||||||
self.dates[field] = None
|
self.dates[field] = None
|
||||||
|
|
||||||
def validate(self, widget, data, field):
|
def validate_datetime(self, widget, data, field):
|
||||||
"""
|
"""
|
||||||
Validate current date and time in text entry
|
Validate current date and time in text entry
|
||||||
"""
|
"""
|
||||||
if self.dates[field] is None:
|
if self.dates[field] is None:
|
||||||
return ValidationError(_('Bad Date/Time'))
|
return ValidationError(_('Bad Date/Time'))
|
||||||
|
|
||||||
|
def validate_coordinate(self, widget, data, field):
|
||||||
|
"""
|
||||||
|
Validate current latitude or longitude in text entry
|
||||||
|
"""
|
||||||
|
if field == "Latitude" and not conv_lat_lon(data, "0", "ISO-D"):
|
||||||
|
return ValidationError(_(u"Invalid latitude (syntax: 18\u00b09'") +
|
||||||
|
_('48.21"S, -18.2412 or -18:9:48.21)'))
|
||||||
|
if field == "Longitude" and not conv_lat_lon("0", data, "ISO-D"):
|
||||||
|
return ValidationError(_(u"Invalid longitude (syntax: 18\u00b09'") +
|
||||||
|
_('48.21"E, -18.2412 or -18:9:48.21)'))
|
||||||
|
|
||||||
def __wipe_dialog(self, object):
|
def __wipe_dialog(self, object):
|
||||||
"""
|
"""
|
||||||
Handles the Delete Dialog...
|
Handles the Delete Dialog...
|
||||||
@ -1217,6 +1229,12 @@ class EditExifMetadata(Gramplet):
|
|||||||
self.exif_widgets["Longitude"].set_text(
|
self.exif_widgets["Longitude"].set_text(
|
||||||
"""%s° %s′ %s″ %s""" % (longdeg, longmin, longsec, LongRef) )
|
"""%s° %s′ %s″ %s""" % (longdeg, longmin, longsec, LongRef) )
|
||||||
|
|
||||||
|
# translate the direction references
|
||||||
|
self.convert_format('DEG')
|
||||||
|
|
||||||
|
self.exif_widgets["Latitude"].validate()
|
||||||
|
self.exif_widgets["Longitude"].validate()
|
||||||
|
|
||||||
elif widgetName == "Altitude":
|
elif widgetName == "Altitude":
|
||||||
altitude = tagValue
|
altitude = tagValue
|
||||||
AltitudeRef = self._get_value(_DATAMAP["AltitudeRef"])
|
AltitudeRef = self._get_value(_DATAMAP["AltitudeRef"])
|
||||||
@ -1290,129 +1308,33 @@ class EditExifMetadata(Gramplet):
|
|||||||
# -------------------------------------------------------------------
|
# -------------------------------------------------------------------
|
||||||
# GPS Coordinates functions
|
# GPS Coordinates functions
|
||||||
# -------------------------------------------------------------------
|
# -------------------------------------------------------------------
|
||||||
def addsymbols2gps(self, latitude =False, longitude =False):
|
def convert_format(self, format):
|
||||||
"""
|
"""
|
||||||
converts a degrees, minutes, seconds representation of Latitude/ Longitude
|
Convert GPS Coordinates into a specified format.
|
||||||
without their symbols to having them...
|
|
||||||
|
|
||||||
@param: latitude -- Latitude GPS Coordinates
|
|
||||||
@param: longitude -- Longitude GPS Coordinates
|
|
||||||
"""
|
"""
|
||||||
LatitudeRef, LongitudeRef = "N", "E"
|
latitude = self.exif_widgets["Latitude"].get_text()
|
||||||
|
longitude = self.exif_widgets["Longitude"].get_text()
|
||||||
|
|
||||||
# check to see if Latitude/ Longitude exits?
|
latitude, longitude = conv_lat_lon(unicode(latitude),
|
||||||
if (latitude and longitude):
|
unicode(longitude),
|
||||||
|
format)
|
||||||
|
|
||||||
if (latitude.count(".") == 1 and longitude.count(".") == 1):
|
if latitude is not None:
|
||||||
self.convert2dms(self.plugin_image)
|
self.exif_widgets["Latitude"].set_text(latitude)
|
||||||
|
self.exif_widgets["Longitude"].set_text(longitude)
|
||||||
# get Latitude/ Longitude after converting it...
|
|
||||||
latitude = self.exif_widgets["Latitude"].get_text()
|
|
||||||
longitude = self.exif_widgets["Longitude"].get_text()
|
|
||||||
|
|
||||||
# add DMS symbols if necessary?
|
|
||||||
# the conversion to decimal format, require the DMS symbols
|
|
||||||
elif ( (latitude.count("°") == 0 and longitude.count("°") == 0) and
|
|
||||||
(latitude.count("′") == 0 and longitude.count("′") == 0) and
|
|
||||||
(latitude.count('″') == 0 and longitude.count('″') == 0) ):
|
|
||||||
|
|
||||||
# is there a direction element here?
|
|
||||||
if (latitude.count("N") == 1 or latitude.count("S") == 1):
|
|
||||||
latdeg, latmin, latsec, LatitudeRef = latitude.split(" ", 3)
|
|
||||||
else:
|
|
||||||
atitudeRef = "N"
|
|
||||||
latdeg, latmin, latsec = latitude.split(" ", 2)
|
|
||||||
if latdeg[0] == "-":
|
|
||||||
latdeg = latdeg.replace("-", "")
|
|
||||||
LatitudeRef = "S"
|
|
||||||
|
|
||||||
# is there a direction element here?
|
|
||||||
if (longitude.count("E") == 1 or longitude.count("W") == 1):
|
|
||||||
longdeg, longmin, longsec, LongitudeRef = longitude.split(" ", 3)
|
|
||||||
else:
|
|
||||||
ongitudeRef = "E"
|
|
||||||
longdeg, longmin, longsec = longitude.split(" ", 2)
|
|
||||||
if longdeg[0] == "-":
|
|
||||||
longdeg = longdeg.replace("-", "")
|
|
||||||
LongitudeRef = "W"
|
|
||||||
|
|
||||||
latitude = """%s° %s′ %s″ %s""" % (latdeg, latmin, latsec, LatitudeRef)
|
|
||||||
longitude = """%s° %s′ %s″ %s""" % (longdeg, longmin, longsec, LongitudeRef)
|
|
||||||
|
|
||||||
return latitude, longitude
|
|
||||||
|
|
||||||
def convert2decimal(self, object):
|
def convert2decimal(self, object):
|
||||||
"""
|
"""
|
||||||
will convert a decimal GPS Coordinates into decimal format.
|
will convert a decimal GPS Coordinates into decimal format.
|
||||||
|
|
||||||
@param: latitude -- GPS Latitude Coordinates from data field...
|
|
||||||
@param: longitude -- GPS Longitude Coordinates from data field...
|
|
||||||
"""
|
"""
|
||||||
|
self.convert_format("D.D8")
|
||||||
# get Latitude/ Longitude from the data fields
|
|
||||||
latitude = self.exif_widgets["Latitude"].get_text()
|
|
||||||
longitude = self.exif_widgets["Longitude"].get_text()
|
|
||||||
|
|
||||||
# if latitude and longitude exist?
|
|
||||||
if (latitude and longitude):
|
|
||||||
|
|
||||||
# is Latitude/ Longitude are in DMS format?
|
|
||||||
if (latitude.count(" ") >= 2 and longitude.count(" ") >= 2):
|
|
||||||
|
|
||||||
# add DMS symbols if necessary?
|
|
||||||
# the conversion to decimal format, require the DMS symbols
|
|
||||||
if ( (latitude.count("°") == 0 and longitude.count("°") == 0) and
|
|
||||||
(latitude.count("′") == 0 and longitude.count("′") == 0) and
|
|
||||||
(latitude.count('″') == 0 and longitude.count('″') == 0) ):
|
|
||||||
|
|
||||||
latitude, longitude = self.addsymbols2gps(latitude, longitude)
|
|
||||||
|
|
||||||
# convert degrees, minutes, seconds w/ symbols to an 8 point decimal
|
|
||||||
latitude, longitude = conv_lat_lon( unicode(latitude),
|
|
||||||
unicode(longitude), "D.D8")
|
|
||||||
|
|
||||||
self.exif_widgets["Latitude"].set_text(latitude)
|
|
||||||
self.exif_widgets["Longitude"].set_text(longitude)
|
|
||||||
|
|
||||||
def convert2dms(self, object):
|
def convert2dms(self, object):
|
||||||
"""
|
"""
|
||||||
will convert a decimal GPS Coordinates into degrees, minutes, seconds
|
will convert a decimal GPS Coordinates into degrees, minutes, seconds
|
||||||
for display only
|
for display only
|
||||||
"""
|
"""
|
||||||
|
self.convert_format("DEG")
|
||||||
latitude = self.exif_widgets["Latitude"].get_text()
|
|
||||||
longitude = self.exif_widgets["Longitude"].get_text()
|
|
||||||
|
|
||||||
# if Latitude/ Longitude exists?
|
|
||||||
if (latitude and longitude):
|
|
||||||
|
|
||||||
# if coordinates are in decimal format?
|
|
||||||
if (latitude.count(".") == 1 and longitude.count(".") == 1):
|
|
||||||
|
|
||||||
# convert latitude and longitude to a DMS with separator of ":"
|
|
||||||
latitude, longitude = conv_lat_lon(latitude, longitude, "DEG-:")
|
|
||||||
|
|
||||||
# remove negative symbol if there is one?
|
|
||||||
LatitudeRef = "N"
|
|
||||||
if latitude[0] == "-":
|
|
||||||
latitude = latitude.replace("-", "")
|
|
||||||
LatitudeRef = "S"
|
|
||||||
latdeg, latmin, latsec = latitude.split(":", 2)
|
|
||||||
|
|
||||||
# remove negative symbol if there is one?
|
|
||||||
LongitudeRef = "E"
|
|
||||||
if longitude[0] == "-":
|
|
||||||
longitude = longitude.replace("-", "")
|
|
||||||
LongitudeRef = "W"
|
|
||||||
longdeg, longmin, longsec = longitude.split(":", 2)
|
|
||||||
|
|
||||||
latitude = """%s° %s′ %s″ %s""" % (latdeg, latmin, latsec, LatitudeRef)
|
|
||||||
self.exif_widgets["Latitude"].set_text(latitude)
|
|
||||||
|
|
||||||
longitude = """%s° %s′ %s″ %s""" % (longdeg, longmin, longsec, LongitudeRef)
|
|
||||||
self.exif_widgets["Longitude"].set_text(longitude)
|
|
||||||
|
|
||||||
return latitude, longitude
|
|
||||||
|
|
||||||
def save_metadata(self, object):
|
def save_metadata(self, object):
|
||||||
"""
|
"""
|
||||||
@ -1442,63 +1364,34 @@ class EditExifMetadata(Gramplet):
|
|||||||
|
|
||||||
# Latitude/ Longitude...
|
# Latitude/ Longitude...
|
||||||
elif widgetName == "Latitude":
|
elif widgetName == "Latitude":
|
||||||
latitude = self.exif_widgets["Latitude"].get_text()
|
latitude = self.exif_widgets["Latitude"].get_text()
|
||||||
longitude = self.exif_widgets["Longitude"].get_text()
|
longitude = self.exif_widgets["Longitude"].get_text()
|
||||||
|
|
||||||
# check to see if Latitude/ Longitude exists?
|
latitude, longitude = conv_lat_lon(unicode(latitude),
|
||||||
if (latitude and longitude):
|
unicode(longitude),
|
||||||
|
"DEG-:")
|
||||||
|
if latitude is not None:
|
||||||
|
if "-" in latitude:
|
||||||
|
LatitudeRef = "S"
|
||||||
|
else:
|
||||||
|
LatitudeRef = "N"
|
||||||
|
latitude = latitude.replace("-", "")
|
||||||
|
|
||||||
# complete some error checking to prevent crashes...
|
if "-" in longitude:
|
||||||
# if "?" character exist, remove it?
|
LongitudeRef = "W"
|
||||||
if "?" in latitude:
|
else:
|
||||||
latitude = latitude.replace("?", "")
|
LongitudeRef = "E"
|
||||||
if "?" in longitude:
|
longitude = longitude.replace("-", "")
|
||||||
longitude = longitude.replace("?", "")
|
|
||||||
|
|
||||||
# if "," character exists, remove it?
|
|
||||||
if "," in latitude:
|
|
||||||
latitude = latitude.replace(",", "")
|
|
||||||
if "," in longitude:
|
|
||||||
longitude = longitude.replace(",", "")
|
|
||||||
|
|
||||||
# if it is in decimal format, convert it to DMS?
|
|
||||||
# if not, then do nothing?
|
|
||||||
self.convert2dms(self.plugin_image)
|
|
||||||
|
|
||||||
# get Latitude/ Longitude from the data fields
|
|
||||||
latitude = self.exif_widgets["Latitude"].get_text()
|
|
||||||
longitude = self.exif_widgets["Longitude"].get_text()
|
|
||||||
|
|
||||||
# will add (degrees, minutes, seconds) symbols if needed?
|
|
||||||
# if not, do nothing...
|
|
||||||
latitude, longitude = self.addsymbols2gps(latitude, longitude)
|
|
||||||
|
|
||||||
# set up display
|
|
||||||
self.exif_widgets["Latitude"].set_text(latitude)
|
|
||||||
self.exif_widgets["Longitude"].set_text(longitude)
|
|
||||||
|
|
||||||
LatitudeRef = " N"
|
|
||||||
if "S" in latitude:
|
|
||||||
LatitudeRef = " S"
|
|
||||||
latitude = latitude.replace(LatitudeRef, "")
|
|
||||||
LatitudeRef = LatitudeRef.replace(" ", "")
|
|
||||||
|
|
||||||
LongitudeRef = " E"
|
|
||||||
if "W" in longitude:
|
|
||||||
LongitudeRef = " W"
|
|
||||||
longitude = longitude.replace(LongitudeRef, "")
|
|
||||||
LongitudeRef = LongitudeRef.replace(" ", "")
|
|
||||||
|
|
||||||
# remove symbols for saving Latitude/ Longitude GPS Coordinates
|
|
||||||
latitude, longitude = _removesymbols4saving(latitude, longitude)
|
|
||||||
|
|
||||||
# convert (degrees, minutes, seconds) to Rational for saving
|
# convert (degrees, minutes, seconds) to Rational for saving
|
||||||
self._set_value(_DATAMAP["LatitudeRef"], LatitudeRef)
|
self._set_value(_DATAMAP["LatitudeRef"], LatitudeRef)
|
||||||
self._set_value(_DATAMAP["Latitude"], coords_to_rational(latitude) )
|
self._set_value(_DATAMAP["Latitude"],
|
||||||
|
coords_to_rational(latitude))
|
||||||
|
|
||||||
# convert (degrees, minutes, seconds) to Rational for saving
|
# convert (degrees, minutes, seconds) to Rational for saving
|
||||||
self._set_value(_DATAMAP["LongitudeRef"], LongitudeRef)
|
self._set_value(_DATAMAP["LongitudeRef"], LongitudeRef)
|
||||||
self._set_value(_DATAMAP["Longitude"], coords_to_rational(longitude) )
|
self._set_value(_DATAMAP["Longitude"],
|
||||||
|
coords_to_rational(longitude))
|
||||||
|
|
||||||
# Altitude, and Altitude Reference...
|
# Altitude, and Altitude Reference...
|
||||||
elif widgetName == "Altitude":
|
elif widgetName == "Altitude":
|
||||||
@ -1605,7 +1498,6 @@ def string_to_rational(coordinate):
|
|||||||
"""
|
"""
|
||||||
convert string to rational variable for GPS
|
convert string to rational variable for GPS
|
||||||
"""
|
"""
|
||||||
|
|
||||||
if '.' in coordinate:
|
if '.' in coordinate:
|
||||||
value1, value2 = coordinate.split('.')
|
value1, value2 = coordinate.split('.')
|
||||||
return pyexiv2.Rational(int(float(value1 + value2)), 10**len(value2))
|
return pyexiv2.Rational(int(float(value1 + value2)), 10**len(value2))
|
||||||
@ -1614,17 +1506,13 @@ def string_to_rational(coordinate):
|
|||||||
|
|
||||||
def coords_to_rational(Coordinates):
|
def coords_to_rational(Coordinates):
|
||||||
"""
|
"""
|
||||||
returns the rational equivalent for Latitude/ Longitude, gpsTimeStamp, and Altitude...
|
returns the rational equivalent for Latitude/ Longitude, gpsTimeStamp,
|
||||||
|
and Altitude...
|
||||||
"""
|
"""
|
||||||
|
# Latitude, Longitude, gpsTimeStamp...
|
||||||
# Latitude/ Longitude...
|
if ":" in Coordinates:
|
||||||
if " " in Coordinates:
|
Coordinates = [string_to_rational(coordinate)
|
||||||
Coordinates = [string_to_rational(coordinate) for coordinate in Coordinates.split(" ")]
|
for coordinate in Coordinates.split(":")]
|
||||||
|
|
||||||
# gpsTimeStamp...
|
|
||||||
elif ":" in Coordinates:
|
|
||||||
Coordinates = [string_to_rational(coordinate) for coordinate in Coordinates.split(":")]
|
|
||||||
|
|
||||||
# Altitude...
|
# Altitude...
|
||||||
else:
|
else:
|
||||||
Coordinates = [string_to_rational(Coordinates)]
|
Coordinates = [string_to_rational(Coordinates)]
|
||||||
@ -1635,35 +1523,8 @@ def convert_value(value):
|
|||||||
"""
|
"""
|
||||||
will take a value from the coordinates and return its value
|
will take a value from the coordinates and return its value
|
||||||
"""
|
"""
|
||||||
|
|
||||||
if isinstance(value, (Fraction, pyexiv2.Rational)):
|
if isinstance(value, (Fraction, pyexiv2.Rational)):
|
||||||
|
return str((Decimal(value.numerator) / Decimal(value.denominator)))
|
||||||
return str( (Decimal(value.numerator) / Decimal(value.denominator) ) )
|
|
||||||
|
|
||||||
def _removesymbols4saving(latitude, longitude):
|
|
||||||
"""
|
|
||||||
will recieve a DMS with symbols and return it without them
|
|
||||||
|
|
||||||
@param: latitude -- Latitude GPS Coordinates
|
|
||||||
@param: longitude -- GPS Longitude Coordinates
|
|
||||||
"""
|
|
||||||
|
|
||||||
# check to see if latitude/ longitude exist?
|
|
||||||
if (latitude and longitude):
|
|
||||||
|
|
||||||
# remove degrees symbol if it exist?
|
|
||||||
latitude = latitude.replace("°", "")
|
|
||||||
longitude = longitude.replace("°", "")
|
|
||||||
|
|
||||||
# remove minutes symbol if it exist?
|
|
||||||
latitude = latitude.replace("′", "")
|
|
||||||
longitude = longitude.replace("′", "")
|
|
||||||
|
|
||||||
# remove seconds symbol if it exist?
|
|
||||||
latitude = latitude.replace('″', "")
|
|
||||||
longitude = longitude.replace('″', "")
|
|
||||||
|
|
||||||
return latitude, longitude
|
|
||||||
|
|
||||||
def rational_to_dms(coords):
|
def rational_to_dms(coords):
|
||||||
"""
|
"""
|
||||||
@ -1671,16 +1532,14 @@ def rational_to_dms(coords):
|
|||||||
|
|
||||||
[Fraction(40, 1), Fraction(0, 1), Fraction(1079, 20)]
|
[Fraction(40, 1), Fraction(0, 1), Fraction(1079, 20)]
|
||||||
"""
|
"""
|
||||||
|
|
||||||
# coordinates look like:
|
# coordinates look like:
|
||||||
# [Rational(38, 1), Rational(38, 1), Rational(150, 50)]
|
# [Rational(38, 1), Rational(38, 1), Rational(150, 50)]
|
||||||
# or [Fraction(38, 1), Fraction(38, 1), Fraction(318, 100)]
|
# or [Fraction(38, 1), Fraction(38, 1), Fraction(318, 100)]
|
||||||
if isinstance(coords, list):
|
if isinstance(coords, list):
|
||||||
|
|
||||||
if len(coords) == 3:
|
if len(coords) == 3:
|
||||||
return [convert_value(coordinate) for coordinate in coords]
|
return [convert_value(coordinate) for coordinate in coords]
|
||||||
|
|
||||||
elif isinstance(coords, (Fraction, pyexiv2.Rational) ):
|
elif isinstance(coords, (Fraction, pyexiv2.Rational)):
|
||||||
if len(coords) == 1:
|
if len(coords) == 1:
|
||||||
return convert_value(coords)
|
return convert_value(coords)
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user