def to_kml(self, filename): """ Export the group to a kml file """ if not self.sights: print('This group does not have sights. Aborting export.') return document = KML.Document() document.append(KML.title(self.name)) if self.description: document.append(KML.description(self.description)) country_folders = {} place_folders = {} for sight in self.sights.all(): if not sight.geoposition: continue placemark = KML.Placemark( KML.name(u'{0.name}'.format(sight)), KML.description(sight.get_long_description()), KML.Point(KML.coordinates('{0[0]}, {0[1]}, 0.0'.format( sight.geoposition.coords, ))), ) placemark.append(KML.ExtendedData( KML.Data( name='gx_media_links', value=u'{name}.jpg'.format(name=sight.name), ) )) place_folder_id = sight.thplace.id country_folder_id = sight.thplace.thcountry.id country_folder = country_folders.setdefault( country_folder_id, KML.Folder(KML.name(sight.thplace.thcountry.name)), ) place_folder = place_folders.setdefault( place_folder_id, KML.Folder(KML.name(sight.thplace.name)), ) place_folder.append(placemark) country_folder.append(place_folder) document.append(country_folder) file_obj = open(filename, 'w') file_obj.write( etree.tostring( document, pretty_print=True, encoding='utf8'))