Merge remote-tracking branch 'origin/v1.1'

Els commits fets incorporen una reestructuració del codi del frontend.
diff --git a/.gitmodules b/.gitmodules
index 91a3700..e69de29 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -1,3 +0,0 @@
-[submodule "backend"]
-	path = backend
-	url = https://github.com/delefme/covid-tracability-backend
diff --git a/TableParser.py b/TableParser.py
index 537f393..faeefc3 100644
--- a/TableParser.py
+++ b/TableParser.py
@@ -25,29 +25,38 @@
         table = soup.find(id="day_main")
 
         hores = []
+        implicitClasses = []
+
         for h in range(8,22):
             newhour = ""
             if h < 10:
                 newhour += "0"
-            newhour += str(h);
+            newhour += str(h)
 
-            hores.append(newhour + ":00");
-            hores.append(newhour + ":30");
+            hores.append(newhour + ":00")
+            implicitClasses.append([])
+            hores.append(newhour + ":30")
+            implicitClasses.append([])
 
         p = re.compile(r"Aula (\S+) ?\(\d*\)", re.IGNORECASE)
 
+        horaActual = 0
         for hora in hores:
             td_hora = table.find(text=hora).findNext('td')
             column = 1
 
             while hora not in td_hora.get_text():
+                while column in implicitClasses[horaActual]:
+                    column += 1
 
                 classes = td_hora['class'];
                 if td_hora.has_attr('class') and not td_hora['class'][0] in self.EMPTY_CELL_CLASSES:
                     assignatura = td_hora.get_text().strip()
+                    degree = td_hora.get("class")[0]
                     aulaRaw = table.find_all("th")[column].get_text().strip()
                     aula = p.match(aulaRaw).group(1)
-                    durada = int(td_hora.get("rowspan"))*30
+                    files = int(td_hora.get("rowspan"))
+                    durada = files*30
 
                     timeSplit = hora.split(':')
 
@@ -60,22 +69,29 @@
                     print(("Afegint " if db != None else "") + assignatura
                             + ", " + hora
                             + ", " + str(durada) + "mins"
-                            + ", " + aula)
+                            + ", " + aula
+                            + ", " + degree)
 
                     if db != None:
                         cursor1 = db.cursor()
-                        cursor1.execute("SELECT id FROM classes WHERE calendar_name = ? AND room = ? AND begins = ? AND ends = ?",
-                                assignatura, aula, begins, ends)
+                        cursor1.execute("SELECT id FROM classes WHERE calendar_name = ? AND room = ? AND begins = ? AND ends = ? AND degree = ?",
+                                assignatura, aula, begins, ends, degree)
                         row = cursor1.fetchone()
                         if row:
                             print("[WARNING] Ja estava a la DB (id " + str(row.id) + ")")
                         else:
                             cursor2 = db.cursor()
-                            cursor2.execute("INSERT INTO classes (calendar_name, room, begins, ends) VALUES (?, ?, ?, ?)",
-                                    assignatura, aula, begins, ends)
+                            cursor2.execute("INSERT INTO classes (calendar_name, room, begins, ends, degree) VALUES (?, ?, ?, ?, ?)",
+                                    assignatura, aula, begins, ends, degree)
+
+                    for i in range(1, files - 1):
+                        if i < len(implicitClasses):
+                            implicitClasses[horaActual + i].append(column)
 
                 td_hora = td_hora.findNext('td')
                 column = column + 1
 
+            horaActual = horaActual + 1
+
         if db != None:
             db.commit()
diff --git a/backend b/backend
deleted file mode 160000
index c16e8d1..0000000
--- a/backend
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit c16e8d15baa438954f63c81372037e5e89af88ea
diff --git a/cron-parse-tables.py b/cron-parse-tables.py
index 7ed1dee..f98816a 100644
--- a/cron-parse-tables.py
+++ b/cron-parse-tables.py
@@ -9,47 +9,59 @@
     config = configparser.ConfigParser()
     config.read('config.ini')
 
-    db_host = config['db']['host']
-    db_database = config['db']['database']
-    db_user = config['db']['user']
-    db_password = config['db']['password']
-
-    connection_string = (
-        'DRIVER=MySQL ODBC 8.0 ANSI Driver;'
-        'SERVER=' + db_host + ';'
-        'DATABASE=' + db_database + ';'
-        'UID=' + db_user + ';'
-        'PWD=' + db_password + ';'
-        'charset=utf8mb4;'
-    )
-
-    db = pyodbc.connect(connection_string)
-    db.setdecoding(pyodbc.SQL_WCHAR, encoding='utf-8')
-    db.setencoding(encoding='utf-8')
+    loadDB = True
 
     try:
-        opts, args = getopt.getopt(argv, 'o:', ['offset='])
+        opts, args = getopt.getopt(argv, 'o:d', ['offset=', 'dryrun'])
     except getopt.GetoptError:
         print('Usage: python cron-parse-tables.py -o <offset_in_days>')
         print('    The offset is the day relative to today that wants to be')
         print('    parsed. For instance, -1 is yesterday and 1 is tomorrow.')
+        print('')
+        print('You can also use the option -d to perform a dry run (doesn\'t')
+        print('save anything to the database)')
         sys.exit(2)
 
     offset = 1
     for opt, arg in opts:
         if opt in ('-o', '--offset'):
             offset = arg
+        elif opt in ('-d', '--dryrun'):
+            loadDB = False
         else:
             print('Parameter \'' + opt + '\' not recognized.')
             print('')
             print('Run python cron-parse-tables.py to get help on how to use')
             print('this script.')
 
+    db = None
+
+    if loadDB:
+        db_host = config['db']['host']
+        db_database = config['db']['database']
+        db_user = config['db']['user']
+        db_password = config['db']['password']
+
+        connection_string = (
+            'DRIVER=MySQL ODBC 8.0 ANSI Driver;'
+            'SERVER=' + db_host + ';'
+            'DATABASE=' + db_database + ';'
+            'UID=' + db_user + ';'
+            'PWD=' + db_password + ';'
+            'charset=utf8mb4;'
+        )
+
+        db = pyodbc.connect(connection_string)
+        db.setdecoding(pyodbc.SQL_WCHAR, encoding='utf-8')
+        db.setencoding(encoding='utf-8')
+
     offset = int(offset)
 
     print('Parsejant les classes ' +
         (('de fa ' if offset < 0 else 'de dins de ') +
         str(abs(offset)) + (' dia' if abs(offset) == 1 else ' dies') if offset != 0 else 'd\'avui'))
+    if not loadDB:
+        print('NOTA: Dry run')
 
     tomorrow = datetime.date.today() + datetime.timedelta(days=offset)