diff --git a/modules/biplan/backend.py b/modules/biplan/backend.py index 4ae6fdbc..e612e366 100644 --- a/modules/biplan/backend.py +++ b/modules/biplan/backend.py @@ -19,7 +19,7 @@ from weboob.tools.backend import BaseBackend -from weboob.capabilities.calendar import ICapCalendarEvent +from weboob.capabilities.calendar import ICapCalendarEvent, CATEGORIES import itertools from .browser import BiplanBrowser @@ -35,19 +35,38 @@ class BiplanBackend(BaseBackend, ICapCalendarEvent): EMAIL = 'carton_ben@yahoo.fr' LICENSE = 'AGPLv3+' VERSION = '0.h' - + ASSOCIATED_CATEGORIES = [CATEGORIES.CONCERT, CATEGORIES.THEATRE] BROWSER = BiplanBrowser + def search_events(self, query): + if self.has_matching_categories(query): + with self.browser: + theatre_events = [] + concert_events = [] + if CATEGORIES.CONCERT in query.categories: + concert_events = self.browser.list_events_concert(query.start_date, + query.end_date, + query.city, + query.categories) + if CATEGORIES.THEATRE in query.categories: + theatre_events = self.browser.list_events_theatre(query.start_date, + query.end_date, + query.city, + query.categories) + + return itertools.chain(concert_events, theatre_events) + def list_events(self, date_from, date_to=None): with self.browser: return itertools.chain(self.browser.list_events_concert(date_from, date_to), self.browser.list_events_theatre(date_from, date_to)) - def get_event(self, _id, event=None): + def get_event(self, _id): with self.browser: - return self.browser.get_event(_id, event) + return self.browser.get_event(_id) def fill_obj(self, event, fields): - self.get_event(event.id, event) + with self.browser: + return self.browser.get_event(event.id, event) OBJECTS = {BiplanCalendarEvent: fill_obj} diff --git a/modules/biplan/browser.py b/modules/biplan/browser.py index cd379ea3..55d954c9 100644 --- a/modules/biplan/browser.py +++ b/modules/biplan/browser.py @@ -38,15 +38,15 @@ class BiplanBrowser(BaseBrowser): '%s://%s/(.*?)' % (PROTOCOL, DOMAIN): EventPage, } - def list_events_concert(self, date_from, date_to=None): + def list_events_concert(self, date_from, date_to=None, city=None, categories=None): self.location('%s://%s/fr/biplan-prog-concert.php' % (self.PROTOCOL, self.DOMAIN)) assert self.is_on_page(ProgramPage) - return self.page.list_events(date_from, date_to, is_concert=True) + return self.page.list_events(date_from, date_to, city, categories, is_concert=True) - def list_events_theatre(self, date_from, date_to=None): + def list_events_theatre(self, date_from, date_to=None, city=None, categories=None): self.location('%s://%s/fr/biplan-prog-theatre.php' % (self.PROTOCOL, self.DOMAIN)) assert self.is_on_page(ProgramPage) - return self.page.list_events(date_from, date_to, is_concert=False) + return self.page.list_events(date_from, date_to, city, categories, is_concert=False) @id2url(BiplanCalendarEvent.id2url) def get_event(self, url, event=None): diff --git a/modules/biplan/calendar.py b/modules/biplan/calendar.py index 53b89a48..b53ac4a0 100644 --- a/modules/biplan/calendar.py +++ b/modules/biplan/calendar.py @@ -22,7 +22,8 @@ from weboob.capabilities.calendar import BaseCalendarEvent, TRANSP, STATUS, CATE class BiplanCalendarEvent(BaseCalendarEvent): - location = '19, rue Colbert - 59000 LILLE' + city = 'LILLE' + location = '19, rue Colbert' sequence = 1 transp = TRANSP.TRANSPARENT status = STATUS.CONFIRMED diff --git a/modules/biplan/pages.py b/modules/biplan/pages.py index a4213737..8dc562bf 100644 --- a/modules/biplan/pages.py +++ b/modules/biplan/pages.py @@ -36,44 +36,56 @@ def parse_b(b): class ProgramPage(BasePage): - def list_events(self, date_from, date_to=None, is_concert=None): + def list_events(self, date_from, date_to=None, city=None, categories=None, is_concert=True): divs = self.document.getroot().xpath("//div[@class='ligne']") for i in range(1, len(divs)): - event = self.create_event(divs[i], date_from, date_to, is_concert) + event = self.create_event(divs[i], date_from, date_to, city, categories, is_concert=is_concert) if event: yield event - def create_event(self, div, date_from, date_to, is_concert): + def create_event(self, div, date_from, date_to, city=None, categories=None, is_concert=True): re_id = re.compile('/(.*?).html', re.DOTALL) a_id = self.parser.select(div, "div/a", 1, method='xpath') b = self.parser.select(div, "div/div/b", 2, method='xpath') _id = re_id.search(a_id.attrib['href']).group(1) date = self.parse_date(b[0].text_content()) + time_price = parse_b(b[1].text_content()) - if _id and self.is_event_in_valid_period(date, date_from, date_to): + start_time = self.parse_start_time(time_price) + start_date = datetime.combine(date, start_time) + end_date = datetime.combine(start_date, time.max) + + if _id and self.is_event_in_valid_period(start_date, date_from, date_to): if is_concert: event = BiplanCalendarEventConcert(_id) else: event = BiplanCalendarEventTheatre(_id) - time_price = parse_b(b[1].text_content()) - - start_time = self.parse_start_time(time_price) - event.start_date = datetime.combine(date, start_time) - event.end_date = datetime.combine(event.start_date, time.max) + event.start_date = start_date + event.end_date = end_date price = time_price[time_price.index('-') + 1:] parsed_price = re.findall(r"\d*\,\d+|\d+", " ".join(price)) if parsed_price and len(parsed_price) > 0: - event.price = float(parsed_price[0]) + event.price = float(parsed_price[0].replace(',', '.')) else: event.price = float(0) event.summary = u'%s' % self.parser.select(div, "div/div/div/a/strong", 1, method='xpath').text - return event + if self.is_valid_event(event, city, categories): + return event + + def is_valid_event(self, event, city, categories): + if city and city != '' and city.upper() != event.city.upper(): + return False + + if categories and len(categories) > 0 and event.category not in categories: + return False + + return True def is_event_in_valid_period(self, event_date, date_from, date_to): if event_date >= date_from: diff --git a/modules/biplan/test.py b/modules/biplan/test.py index b71adfd5..9f4bd11d 100644 --- a/modules/biplan/test.py +++ b/modules/biplan/test.py @@ -28,5 +28,5 @@ class BiplanTest(BackendTest): def test_biplan_list(self): l = list(self.backend.list_events(datetime.now())) assert len(l) - event = self.backend.get_event(l[0].id, None) + event = self.backend.get_event(l[0].id) self.assertTrue(event.url, 'URL for event "%s" not found: %s' % (event.id, event.url))