390
368
# -------------------------------------------------------------------------
392
def download(self, file_name, use_post=True):
394
opener = urllib.request.urlopen(self.BASE_URL, self.get_url_extension())
396
opener = urllib.request.urlopen(self.get_url())
370
def download(self, file_name):
371
opener = urllib2.urlopen(self.get_url())
398
373
if opener.headers['content-type'] != 'image/png':
399
374
raise BadContentTypeException('Server responded with a ' \
400
375
'content-type of %s' % opener.headers['content-type'])
402
open(file_name, 'wb').write(opener.read())
377
open(file_name, 'wb').write(urllib.urlopen(self.get_url()).read())
404
379
# Simple settings
405
380
# -------------------------------------------------------------------------
407
382
def set_title(self, title):
409
self.title = urllib.parse.quote(title)
384
self.title = urllib.quote(title)
411
386
self.title = None
413
def set_title_style(self, colour=None, font_size=None):
414
if not colour is None:
415
_check_colour(colour)
416
if not colour and not font_size:
418
self.title_colour = colour or '333333'
419
self.title_font_size = font_size or 13.5
421
388
def set_legend(self, legend):
422
389
"""legend needs to be a list, tuple or None"""
423
390
assert(isinstance(legend, list) or isinstance(legend, tuple) or
426
self.legend = [urllib.parse.quote(a) for a in legend]
393
self.legend = [urllib.quote(a) for a in legend]
428
395
self.legend = None
430
def set_legend_position(self, legend_position):
432
self.legend_position = urllib.parse.quote(legend_position)
434
self.legend_position = None
437
398
# -------------------------------------------------------------------------
677
615
url_bits.append('chxt=%s' % ','.join(available_axis))
679
url_bits.append('chxl=%s' % '%7c'.join(label_axis))
617
url_bits.append('chxl=%s' % '|'.join(label_axis))
681
url_bits.append('chxr=%s' % '%7c'.join(range_axis))
619
url_bits.append('chxr=%s' % '|'.join(range_axis))
683
url_bits.append('chxp=%s' % '%7c'.join(positions))
621
url_bits.append('chxp=%s' % '|'.join(positions))
685
url_bits.append('chxs=%s' % '%7c'.join(styles))
623
url_bits.append('chxs=%s' % '|'.join(styles))
686
624
return '&'.join(url_bits)
688
626
# Markers, Ranges and Fill area (chm)
689
627
# -------------------------------------------------------------------------
691
def markers_to_url(self):
692
return 'chm=%s' % '%7c'.join([','.join(a) for a in self.markers])
629
def markers_to_url(self):
630
return 'chm=%s' % '|'.join([','.join(a) for a in self.markers])
694
632
def add_marker(self, index, point, marker_type, colour, size, priority=0):
695
633
self.markers.append((marker_type, colour, str(index), str(point), \
696
634
str(size), str(priority)))
698
636
def add_horizontal_range(self, colour, start, stop):
699
self.markers.append(('r', colour, '0', str(start), str(stop)))
701
def add_data_line(self, colour, data_set, size, priority=0):
702
self.markers.append(('D', colour, str(data_set), '0', str(size), \
705
def add_marker_text(self, string, colour, data_set, data_point, size, \
707
self.markers.append((str(string), colour, str(data_set), \
708
str(data_point), str(size), str(priority)))
637
self.markers.append(('r', colour, '1', str(start), str(stop)))
710
639
def add_vertical_range(self, colour, start, stop):
711
self.markers.append(('R', colour, '0', str(start), str(stop)))
640
self.markers.append(('R', colour, '1', str(start), str(stop)))
713
642
def add_fill_range(self, colour, index_start, index_end):
714
643
self.markers.append(('b', colour, str(index_start), str(index_end), \
966
890
Chart.__init__(self, *args, **kwargs)
967
891
self.geo_area = 'world'
969
self.__areas = ('africa', 'asia', 'europe', 'middle_east',
970
'south_america', 'usa', 'world')
972
'AD', 'AE', 'AF', 'AG', 'AI', 'AL', 'AM', 'AN', 'AO', 'AQ', 'AR',
973
'AS', 'AT', 'AU', 'AW', 'AX', 'AZ', 'BA', 'BB', 'BD', 'BE', 'BF',
974
'BG', 'BH', 'BI', 'BJ', 'BL', 'BM', 'BN', 'BO', 'BR', 'BS', 'BT',
975
'BV', 'BW', 'BY', 'BZ', 'CA', 'CC', 'CD', 'CF', 'CG', 'CH', 'CI',
976
'CK', 'CL', 'CM', 'CN', 'CO', 'CR', 'CU', 'CV', 'CX', 'CY', 'CZ',
977
'DE', 'DJ', 'DK', 'DM', 'DO', 'DZ', 'EC', 'EE', 'EG', 'EH', 'ER',
978
'ES', 'ET', 'FI', 'FJ', 'FK', 'FM', 'FO', 'FR', 'GA', 'GB', 'GD',
979
'GE', 'GF', 'GG', 'GH', 'GI', 'GL', 'GM', 'GN', 'GP', 'GQ', 'GR',
980
'GS', 'GT', 'GU', 'GW', 'GY', 'HK', 'HM', 'HN', 'HR', 'HT', 'HU',
981
'ID', 'IE', 'IL', 'IM', 'IN', 'IO', 'IQ', 'IR', 'IS', 'IT', 'JE',
982
'JM', 'JO', 'JP', 'KE', 'KG', 'KH', 'KI', 'KM', 'KN', 'KP', 'KR',
983
'KW', 'KY', 'KZ', 'LA', 'LB', 'LC', 'LI', 'LK', 'LR', 'LS', 'LT',
984
'LU', 'LV', 'LY', 'MA', 'MC', 'MD', 'ME', 'MF', 'MG', 'MH', 'MK',
985
'ML', 'MM', 'MN', 'MO', 'MP', 'MQ', 'MR', 'MS', 'MT', 'MU', 'MV',
986
'MW', 'MX', 'MY', 'MZ', 'NA', 'NC', 'NE', 'NF', 'NG', 'NI', 'NL',
987
'NO', 'NP', 'NR', 'NU', 'NZ', 'OM', 'PA', 'PE', 'PF', 'PG', 'PH',
988
'PK', 'PL', 'PM', 'PN', 'PR', 'PS', 'PT', 'PW', 'PY', 'QA', 'RE',
989
'RO', 'RS', 'RU', 'RW', 'SA', 'SB', 'SC', 'SD', 'SE', 'SG', 'SH',
990
'SI', 'SJ', 'SK', 'SL', 'SM', 'SN', 'SO', 'SR', 'ST', 'SV', 'SY',
991
'SZ', 'TC', 'TD', 'TF', 'TG', 'TH', 'TJ', 'TK', 'TL', 'TM', 'TN',
992
'TO', 'TR', 'TT', 'TV', 'TW', 'TZ', 'UA', 'UG', 'UM', 'US', 'UY',
993
'UZ', 'VA', 'VC', 'VE', 'VG', 'VI', 'VN', 'VU', 'WF', 'WS', 'YE',
994
'YT', 'ZA', 'ZM', 'ZW')
996
894
def type_to_url(self):
999
897
def set_codes(self, codes):
1000
'''Set the country code map for the data.
1001
Codes given in a list.
1012
if cc in self.__ccodes:
1015
raise UnknownCountryCodeException(cc)
1017
self.codes = codemap
1019
def set_geo_area(self, area):
1020
'''Sets the geo area for the map.
1031
if area in self.__areas:
1032
self.geo_area = area
1034
raise UnknownChartType('Unknown chart type for maps: %s' %area)
1036
900
def get_url_bits(self, data_class=None):
1037
901
url_bits = Chart.get_url_bits(self, data_class=data_class)