示例#1
0
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.')
示例#2
0
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.')
示例#3
0
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.')
示例#4
0
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.')
示例#5
0
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.')
示例#6
0
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.')
示例#7
0
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.')
示例#8
0
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.')
示例#9
0
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.')
示例#10
0
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.')
示例#11
0
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.')
示例#12
0
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.')
示例#13
0
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.')
示例#14
0
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.')
示例#15
0
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.')
示例#16
0
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.')
示例#17
0
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.')
示例#18
0
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.')
示例#19
0
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.')
示例#20
0
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.')