def add_radio(): if fk.request.method == 'POST': if fk.request.data: data = json.loads(fk.request.data) name = data.get('name', None) country = data.get('country', None) url = data.get('url', '') language = data.get('language', None) if name is None or country is None or language is None: return service_response(405, 'Radio addition denied', 'A radio has to contain a name, country and language.') else: _radio = Radio.objects(name=name, country=country, language=language).first() if _radio is None: _radio = Radio(created_at=str(datetime.datetime.utcnow())) _radio.name = name _radio.country = country _radio.url = url _radio.language = language _radio.save() return service_response(200, 'Radio created', 'The new radio was added') else: return service_response(204, 'Radio addition denied', 'A radio with this name, country and language already exists.') else: return service_response(204, 'Radio addition failed', 'No data submitted.') else: return service_response(405, 'Method not allowed', 'This endpoint supports only a POST method.')
def news_by_country(country, schedule): if fk.request.method == 'GET': if country == 'all': if schedule == 'all': news = [n.info() for n in News.objects()] else: news = [n.info() for n in News.objects(schedule=schedule)] for n in News.objects(status=schedule): news.append(n.info()) else: news = [] if schedule == 'all': for n in News.objects(country=country): news.append(n.info()) else: for n in News.objects(country=country, schedule=schedule): news.append(n.info()) for n in News.objects(country=country, status=schedule): news.append(n.info()) return service_response( 200, 'Country {0} News with Schedule {1}'.format(country, schedule), { 'size': len(news), 'covers': news }) else: return service_response(405, 'Method not allowed', 'This endpoint supports only a GET method.')
def edit_radio(radio_id): if fk.request.method == 'GET': _radio = Radio.objects.with_id(radio_id) if _radio: if fk.request.data: data = json.loads(fk.request.data) name = data.get('name', _radio.name) country = data.get('country', _radio.country) url = data.get('url', _radio.url) language = data.get('language', _radio.language) _radio_check = Radio.objects(name=name, country=country, language=language).first() if _radio_check is None: _radio.name = name _radio.country = country _radio.url = url _radio.language = language _radio.save() return service_response(200, 'Edition succeeded', 'Radio {0} edited.'.format(radio_id)) else: return service_response(204, 'Radio edition denied', 'A radio with this name, country and language already exists.') else: return service_response(204, 'Radio addition failed', 'No data submitted.') else: return service_response(204, 'Unknown radio', 'No corresponding radio found.') else: return service_response(405, 'Method not allowed', 'This endpoint supports only a GET method.')
def radios_by_country(country): if fk.request.method == 'GET': if country == 'all': radios = [r.info() for r in Radio.objects()] else: radios = [r.info() for r in Radio.objects(country=country)] return service_response(200, 'Country {0} radios'.format(country), {'size':len(radios), 'radios':radios}) else: return service_response(405, 'Method not allowed', 'This endpoint supports only a GET method.')
def delete_radio(radio_id): if fk.request.method == 'GET': _radio = Radio.objects.with_id(radio_id) if _radio: _radio.delete() return service_response(200, 'Deletion succeeded', 'Radio {0} deleted.'.format(radio_id)) else: return service_response(204, 'Unknown radio', 'No corresponding radio found.') else: return service_response(405, 'Method not allowed', 'This endpoint supports only a GET method.')
def news_today_country(country, schedule): if fk.request.method == 'GET': # day = str(datetime.date.today().isoformat()) _country = get_country(country) if _country is None: return service_response(204, 'Unknown country', 'We could not find this country.') else: lat = _country["lat"] lng = _country["lng"] if lat == "": lat = 0.00 lng = 0.00 tz = tzwhere.tzwhere() timeZoneStr = tz.tzNameAt(lat, lng) timeZoneObj = timezone(timeZoneStr) now_time = datetime.datetime.now(timeZoneObj) day = str(now_time).split(" ")[0] if country == 'all': if schedule == 'all': news = [n.info() for n in News.objects(day=day)] else: news = [ n.info() for n in News.objects(day=day, schedule=schedule) ] for n in News.objects(day=day, status=schedule): news.append(n.info()) else: news = [] if schedule == 'all': for n in News.objects(country=country, day=day): news.append(n.info()) else: for n in News.objects(country=country, day=day, schedule=schedule): news.append(n.info()) for n in News.objects(country=country, day=day, status=schedule): news.append(n.info()) return service_response( 200, 'Country {0} News with Schedule {1}'.format(country, schedule), { 'size': len(news), 'news': news }) else: return service_response(405, 'Method not allowed', 'This endpoint supports only a GET method.')
def delete_cover(cover_id): if fk.request.method == 'GET': _cover = Coverage.objects.with_id(cover_id) if _cover: _cover.delete() return service_response(200, 'Deletion succeeded', 'Coverage {0} deleted.'.format(cover_id)) else: return service_response(204, 'Unknown coverage', 'No corresponding coverage found.') else: return service_response(405, 'Method not allowed', 'This endpoint supports only a GET method.')
def covers_by_country(country): if fk.request.method == 'GET': if country == 'all': covers = [c.info() for c in Coverage.objects()] else: covers = [c.info() for c in Coverage.objects(country=country)] return service_response(200, 'Country {0} coverages'.format(country), { 'size': len(covers), 'covers': covers }) else: return service_response(405, 'Method not allowed', 'This endpoint supports only a GET method.')
def show_schedule_cover(cover_id): if fk.request.method == 'GET': _cover = Coverage.objects.with_id(cover_id) if _cover: data = {} data['schedule'] = _cover.schedule data['sync'] = _cover.synchronization data['delivery'] = _cover.delivery return service_response(200, 'Coverage schedule', data) else: return service_response(204, 'Unknown coverage', 'No corresponding coverage found.') else: return service_response(405, 'Method not allowed', 'This endpoint supports only a GET method.')
def pushed_news(news_id): if fk.request.method == 'GET': _news = News.objects.with_id(news_id) if _news: _news.status = 'pushed' _news.save() return service_response( 200, 'News pushed', 'News {0} was confimed pushed.'.format(news_id)) else: return service_response(204, 'Unknown news', 'No corresponding news found.') else: return service_response(405, 'Method not allowed', 'This endpoint supports only a GET method.')
def add_schedule_cover(cover_id, schedule): if fk.request.method == 'GET': _cover = Coverage.objects.with_id(cover_id) if _cover: if schedule in _cover.schedule: return service_response( 201, 'Schedule addition denied', 'There is already an existing schedule at this time.') else: try: insert_idx = 0 sch_hour = int(schedule.split(":")[0]) for index, val in enumerate(_cover.schedule): val_hour = int(val.split(":")[0]) if val_hour > sch_hour: insert_idx = index break _cover.schedule = _cover.schedule.insert( insert_idx, schedule) _cover.synchronization = _cover.synchronization.insert( insert_idx, "") _cover.delivery = _cover.delivery.insert(insert_idx, "") _cover.save() return service_response( 200, 'Schedule add succeeded', 'Coverage schedule {0} added.'.format(schedule)) except: return service_response( 500, 'Schedule addition failed', 'You can only provide: %s' % str([ "24:00", "1:00", "2:00", "3:00", "4:00", "5:00", "6:00", "7:00", "8:00", "9:00", "10:00", "11:00", "12:00", "13:00", "14:00", "15:00", "16:00", "17:00", "18:00", "19:00", "20:00", "21:00", "22:00", "23:00" ])) else: return service_response(204, 'Unknown coverage', 'No corresponding coverage found.') else: return service_response(405, 'Method not allowed', 'This endpoint supports only a GET method.')
def delete_news(country, news_id): if fk.request.method == 'GET': for _new in News.objects(): _new.delete() if news_id == "all": for _new in News.objects(country=country): _new.delete() return service_response(200, 'Deletion succeeded', 'All news deleted') else: _news = News.objects.with_id(news_id) if _news: _news.delete() return service_response(200, 'Deletion succeeded', 'News {0} deleted.'.format(news_id)) else: return service_response(204, 'Unknown news', 'No corresponding news found.') else: return service_response(405, 'Method not allowed', 'This endpoint supports only a GET method.')
def reset_schedule_cover(cover_id, schedule): if fk.request.method == 'GET': _cover = Coverage.objects.with_id(cover_id) if _cover: if schedule not in _cover.schedule: return service_response( 201, 'Schedule delete denied', 'There is no existing schedule at this time.') else: index = _cover.schedule.index(schedule) _cover.synchronization[index] = "" _cover.delivery[index] = "" _cover.save() return service_response( 200, 'Schedule delete succeeded', 'Coverage schedule {0} deleted.'.format(schedule)) else: return service_response(204, 'Unknown coverage', 'No corresponding coverage found.') else: return service_response(405, 'Method not allowed', 'This endpoint supports only a GET method.')
def add_news(): if fk.request.method == 'POST': if fk.request.data: data = json.loads(fk.request.data) radio = data.get('radio', None) coverage = data.get('coverage', None) content = data.get('content', None) _radio = Radio.objects.with_id(radio) _coverage = Coverage.objects.with_id(coverage) if _radio is None or _coverage is None or content is None: return service_response( 405, 'News addition denied', 'A news has to contain a radio, a coverage and content.') else: _news = News.objects(radio=_radio, content=content, coverage=_coverage).first() if _news is None: _news = News(created_at=str(datetime.datetime.utcnow())) _news.radio = radio _news.content = content _news.country = country _news.coverage = coverage _news.importance = news_importance(content) _news.save() return service_response(200, 'News created', 'News added with success.') else: return service_response( 204, 'News addition denied', 'A News with this radio and content already exists.') else: return service_response(204, 'News addition failed', 'No data submitted.') else: return service_response(405, 'Method not allowed', 'This endpoint supports only a POST method.')
def edit_news(news_id): if fk.request.method == 'GET': _news = News.objects.with_id(news_id) if _news: if fk.request.data: data = json.loads(fk.request.data) radio = data.get('radio', str(_news.radio.id)) coverage = data.get('coverage', str(_news.coverage.id)) content = data.get('content', _news.content) status = data.get('status', _news.status) received = data.get('received', _news.received) country = data.get('country', _news.country) _radio = Radio.objects.with_id(radio) _coverage = Coverage.objects.with_id(coverage) if _radio is None or _coverage is None or content is None: return service_response( 405, 'News edition denied', 'A news has to contain a radio, a coverage and content.' ) _news_check = News.objects(radio=radio, content=content, status=status).first() if _news_check is None: _news.radio = radio _news.content = content _news.importance = news_importance(content) _news.status = status _news.received = received _news.country = country _news.save() return service_response(200, 'Edition succeeded', 'News {0} edited.'.format(news_id)) else: return service_response( 204, 'News edition denied', 'A news with this radio, content and status already exists.' ) else: return service_response(204, 'News edition failed', 'No data submitted.') else: return service_response(204, 'Unknown coverage', 'No corresponding coverage found.') else: return service_response(405, 'Method not allowed', 'This endpoint supports only a GET method.')
def edit_cover(cover_id): if fk.request.method == 'GET': _cover = Coverage.objects.with_id(cover_id) if _cover: if fk.request.data: data = json.loads(fk.request.data) name = data.get('name', _cover.name) country = data.get('country', _cover.country) radios = data.get('radios', _cover.radios) schedule = data.get('schedule', _cover.schedule) synchronization = data.get('sync', _cover.synchronization) delivery = data.get('delivery', _cover.delivery) _cover_check = Coverage.objects(name=name, country=country, radios=radios).first() if _cover_check is None: _cover.name = name _cover.country = country _country = get_country(country) if _country is None: return service_response( 204, 'Unknown country', 'We could not find this country.') else: lat = _country["lat"] lng = _country["lng"] if lat == "": lat = 0.00 lng = 0.00 tz = tzwhere.tzwhere() timeZoneStr = tz.tzNameAt(lat, lng) timeZoneObj = timezone(timeZoneStr) now_time = datetime.datetime.now(timeZoneObj) time_block = str(now_time).split(" ") if "-" in time_block[1]: _cover.zone = "GMT-{0}".format( time_block[1].split("-")[1].split(":")[0]) if "+" in time_block[1]: _cover.zone = "GMT+{0}".format( time_block[1].split("+")[1].split(":")[0]) _cover.radios = [ Radio.objects.with_id(radio_id) for radio_id in radios ] _cover.schedule = schedule _cover.synchronization = synchronization _cover.delivery = delivery _cover.save() return service_response( 200, 'Edition succeeded', 'Coverage {0} edited.'.format(cover_id)) else: return service_response( 204, 'Coverage edition denied', 'A coverage with this name, country, zone and radios already exists.' ) else: return service_response(204, 'Coverage edition failed', 'No data submitted.') else: return service_response(204, 'Unknown coverage', 'No corresponding coverage found.') else: return service_response(405, 'Method not allowed', 'This endpoint supports only a GET method.')
def add_cover(): if fk.request.method == 'POST': if fk.request.data: data = json.loads(fk.request.data) name = data.get('name', None) country = data.get('country', None) radios = data.get('radios', None) schedule = data.get('schedule', ["6:00"]) if name is None or country is None or radios is None: return service_response( 405, 'Coverage addition denied', 'A coverage has to contain a name, country, radios and zone.' ) else: _cover = Coverage.objects(name=name, country=country).first() if _cover is None: _cover = Coverage( updated_at=str(datetime.datetime.utcnow())) _cover.name = name _cover.country = country _cover.radios = [ Radio.objects.with_id(radio_id) for radio_id in radios ] _cover.schedule = schedule _cover.synchronization = ["" for s in schedule] _cover.delivery = ["" for s in schedule] _country = get_country(country) if _country is None: return service_response( 204, 'Unknown country', 'We could not find this country.') else: lat = _country["lat"] lng = _country["lng"] if lat == "": lat = 0.00 lng = 0.00 tz = tzwhere.tzwhere() timeZoneStr = tz.tzNameAt(lat, lng) timeZoneObj = timezone(timeZoneStr) now_time = datetime.datetime.now(timeZoneObj) time_block = str(now_time).split(" ") if "-" in time_block[1]: _cover.zone = "GMT-{0}".format( time_block[1].split("-")[1].split(":")[0]) if "+" in time_block[1]: _cover.zone = "GMT+{0}".format( time_block[1].split("+")[1].split(":")[0]) _cover.save() return service_response(200, 'Coverage created', 'Coverage added with success') else: return service_response( 204, 'Coverage addition denied', 'A coverage with this name, country, radios and zone already exists.' ) else: return service_response(204, 'Coverage addition failed', 'No data submitted.') else: return service_response(405, 'Method not allowed', 'This endpoint supports only a POST method.')
def service_menu(): if fk.request.method == 'GET': return service_response(200, 'Service Menu', menu()) else: return service_response(405, 'Method not allowed', 'This endpoint supports only a GET method.')
def sync_cover(country): if fk.request.method == 'GET': _covers = Coverage.objects(country=country) _country = get_country(country) if _country is None: return service_response(204, 'Unknown country', 'We could not find this country.') else: lat = _country["lat"] lng = _country["lng"] if lat == "": lat = 0.00 lng = 0.00 tz = tzwhere.tzwhere() timeZoneStr = tz.tzNameAt(lat, lng) timeZoneObj = timezone(timeZoneStr) now_time = datetime.datetime.now(timeZoneObj) day = str(now_time).split(" ")[0] if "-" in str(now_time).split(" ")[1]: country_time = str(now_time).split(" ")[1].split("-")[0] if "+" in str(now_time).split(" ")[1]: country_time = str(now_time).split(" ")[1].split("+")[0] # day = str(datetime.date.today().isoformat()) # hour = strftime("%H:%M", gmtime()) # hour_now = int(hour.split(':')[0]) country_hour = int(country_time.split(":")[0]) count = 0 _coverages = [] for index, _cover in enumerate(_covers): if _cover: # h_align = _cover.zone.split("GMT")[1] data = {} data['coverage'] = str(_cover.id) data['schedule'] = _cover.schedule # if h_align == "": # h_align = "0" # hour_sch = int(float(hour_now) + float(h_align)) # if hour_sch < 0: # hour_sch = 24 + hour_sch # elif hour_sch > 24: # hour_sch = hour_sch - 24 # print("%d:00".format(hour_sch)) data['country-time'] = country_time data['radios'] = {} try: sync_index = _cover.schedule.index("%d:00" % country_hour) sync_status = _cover.synchronization[sync_index] if sync_status == day: # Mean already synchronized today. skip it. sync_index = -1 except: # When the time is not scheduled look for inconsistencies to fix specially # in the closest lower bound scheduled time. sync_index = -1 for index in reversed( range(len(_cover.synchronization))): if country_hour > int( _cover.schedule[index].split(":")[0]): if _cover.synchronization[index] != day: sync_index = index country_hour = int( _cover.schedule[index].split(":")[0]) break if sync_index != -1: data[ 'comment'] = "coverage schedule %s updated" % _cover.schedule[ sync_index] for r in _cover.radios: data['radios'][r.name] = 0 sub_count = 0 if sync_index != -1: radios = _cover.radios for radio in _cover.radios: crawler = CoreCawler() news = crawler.fetch(radio.url) for new in news: _new, created = News.objects.get_or_create( coverage=_cover, radio=radio, day=day, content=new, country=_cover.country) if created: _new.created_at = str( datetime.datetime.utcnow()) _new.content = new _new.schedule = "%d:00" % country_hour _new.importance = news_importance(new) _new.save() data['radios'][ radio. name] = data['radios'][radio.name] + 1 sub_count = sub_count + 1 count = count + sub_count _cover.synchronization[int(sync_index)] = day _cover.delivery[int(sync_index)] = "0" _cover.save() data['status'] = 'processed' else: data['status'] = 'skiped' data['news'] = sub_count _coverages.append(data) return service_response( 200, 'Coverage sync succeeded', { 'now-gmt': strftime("%H:%M", gmtime()), 'news': count, 'coverages': _coverages }) else: return service_response(405, 'Method not allowed', 'This endpoint supports only a GET method.')
def news_pushing_country(country): if fk.request.method == 'GET': # day = str(datetime.date.today().isoformat()) _country = get_country(country) if _country is None: return service_response(204, 'Unknown country', 'We could not find this country.') else: lat = _country["lat"] lng = _country["lng"] if lat == "": lat = 0.00 lng = 0.00 tz = tzwhere.tzwhere() timeZoneStr = tz.tzNameAt(lat, lng) timeZoneObj = timezone(timeZoneStr) now_time = datetime.datetime.now(timeZoneObj) day = str(now_time).split(" ")[0] if "-" in str(now_time).split(" ")[1]: country_time = str(now_time).split(" ")[1].split("-")[0] if "+" in str(now_time).split(" ")[1]: country_time = str(now_time).split(" ")[1].split("+")[0] country_hour = int(country_time.split(":")[0]) news_pulled = News.objects( country=country, status='pulled', day=day).order_by('-importance').first() if news_pulled: sync_index = -1 coverage = news_pulled.coverage for sync_i in range(len(coverage.synchronization)): if coverage.synchronization[sync_i] == day: if coverage.delivery[sync_i] == "": delivery = 0 else: delivery = int(coverage.delivery[sync_i]) if delivery < 10: sync_index = sync_i break # try: # sync_index = news_pulled.coverage.schedule.index("%d:00"%country_hour) # except: # sync_index = -1 if sync_index != -1: # if coverage.delivery[int(sync_index)] == "": # delivery = 0 # else: # delivery = int(coverage.delivery[int(sync_index)]) # if delivery < 10: news_pulled.satus = 'pushing' news_pulled.save() coverage.delivery[int(sync_index)] = str(delivery + 1) coverage.save() news_pushing = news_pulled.info() return service_response(200, 'News to send', news_pulled.info()) # else: # return service_response(204, 'No news to send', "The sent news went over the number limit permitted to be sent.") else: return service_response( 204, 'No news to send', "The sent news went over the hour limit permitted to sent." ) else: return service_response(204, 'No news to send', "no news at this point.") else: return service_response(405, 'Method not allowed', 'This endpoint supports only a GET method.')