From b302060ca3df8d13508c7129021325c36f96a073 Mon Sep 17 00:00:00 2001
From: emkael <emkael@tlen.pl>
Date: Mon, 31 Aug 2015 12:14:10 +0200
Subject:  * getting rid of custom board mapping - supporting duplicate board
 numbers from BWS data

---
 README.md       | 24 +++++-------------------
 bidding_data.py | 55 ++++++++++++++++++++++++++-----------------------------
 2 files changed, 31 insertions(+), 48 deletions(-)

diff --git a/README.md b/README.md
index f981038..878d2e9 100644
--- a/README.md
+++ b/README.md
@@ -6,7 +6,7 @@ Narzędzie dodające do strony wyników z JFR Pary dane licytacji, zbierane w pl
 BWS "pierniczkami" nowego typu.
 
 Przykładowe efekty działania:
-[rozdania szkoleniowe z BOOM 2015](http://www.pzbs.pl/wyniki/boom/2015/boom_wirtualne_me.html), 
+[rozdania szkoleniowe z BOOM 2015](http://www.pzbs.pl/wyniki/boom/2015/boom_wirtualne_me.html),
 [Kadra U-20 z butlerem ligowym](http://emkael.info/brydz/wyniki/2015/u20_szczyrk/ligowe.html).
 
 Wymagania systemowe
@@ -58,7 +58,7 @@ mdb-export PLIK.bws RoundData > DANE_USTAWIENIA.csv
 Po wygenerowaniu w/w plików CSV, [`bidding_data.py`](bidding_data.py)
 przyjmuje następujące parametry:
 ```
-python bidding_data.py DANE_LICYTACJI.csv DANE_USTAWIENIA.csv KATALOG_ROBOCZY_Z_PREFIKSEM_TURNIEJU [mapowanie numerów rozdań]
+python bidding_data.py DANE_LICYTACJI.csv DANE_USTAWIENIA.csv KATALOG_ROBOCZY_Z_PREFIKSEM_TURNIEJU
 ```
 
 `DANE_LICYTACJI.csv` i `DANE_USTAWIENIA.csv` to pliki z danymi wyeskportowanymi
@@ -70,27 +70,13 @@ Parowym prefiksem turnieju (czyli np. `..\www\moj_turniej`).
 Udostępniany ze skryptem wrapper [`bidding_data.sh`](bidding_data.sh)
 obsługuje eksport z BWS poprzez `mdb-export`, wystarczy więc:
 ```
-./bidding_data.sh PLIK.bws KATALOG_ROBOCZY_Z_PREFIKSEM_TURNIEJU [mapowanie numerów rozdań]
+./bidding_data.sh PLIK.bws KATALOG_ROBOCZY_Z_PREFIKSEM_TURNIEJU
 ```
 
 Narzędzie obsługuje niestandardowe zakresy numeracji rozdań w turnieju.
 
-Domyślnie, mapowanie numeru rozdań z Par na numer rozdania w BWS
-(numer fizycznego pudełka), odbywa się automatycznie (na podstawie danych z BWS).
-
-Możliwe jest jednak podanie własnego mapowania numerów rozdań (przydatne np.
-wtedy, gdy w turnieju te same pudełka używane są więcej niż jeden raz, a gdy 
-fizyczne numery rozdań używane są wiele razy w jednym BWS - wręcz niezbędne).
-
-Osiąga się to poprzez podanie dodatkowych parametrów za katalogiem roboczym.
-Mapowanie określają, kolejno, trzy liczby:
-* numer pierwszego rozdania wg numeracji JFR Pary
-* numer ostatniego rozdania wg numeracji JFR Pary
-* numer pierwszego rozdania w BWS (zakłada się ciągłość numeracji
-w ramach mapowania)
-
-Na przykład, podanie parametrów `1 8 23` sprawi, że protokoły od `*001.html`
-do `*008.html` zostaną uzupełnione o licytację z rozdań 23-30.
+Mapowanie numeru rozdań z Par na numer rozdania w BWS (numer fizycznego pudełka)
+odbywa się automatycznie (na podstawie danych z BWS).
 
 Lista przyszłych usprawnień
 ---------------------------
diff --git a/bidding_data.py b/bidding_data.py
index 0ea56d4..f27f157 100644
--- a/bidding_data.py
+++ b/bidding_data.py
@@ -2,6 +2,7 @@ import csv
 import sys
 import glob
 import re
+import json
 
 from os import path
 from bs4 import BeautifulSoup as bs4
@@ -35,15 +36,15 @@ class JFRBidding:
                 int(sitting[4])])
         return round_lineups
 
-    # converts CSV bidding to
-    # {board}.{sector}_{table}.{round}.{bidding}[] structure,
+    # converts CSV bidding to the structure:
+    # {board}_{round}_{sector}_{table}.{sector}_{table}.{round} -> {bidding}[],
     # including erased calls
     def __parse_bidding_data(self, bidding_data):
         bids = {}
         for bid in bidding_data[1:]:
-            board_no = int(bid[4])
             round_no = int(bid[3])
             table_no = bid[1] + '_' + bid[2]
+            board_no = bid[4] + '_' + str(round_no) + '_' + table_no
             bid_counter = int(bid[5])
             bid_erased = int(bid[10])
             if board_no not in bids:
@@ -105,28 +106,28 @@ class JFRBidding:
                          if pair_numbers is None  # read numbers from lineup
                          else pair_numbers)))     # or use provided numbers
 
-    def __map_board_numbers(self, custom_mapping=None):
+    def __map_board_numbers(self):
         self.__tournament_files = [
             f for f
             in glob.glob(self.__tournament_prefix + '*.html')
             if re.search(self.__tournament_files_match, f)]
-        if custom_mapping is None or len(custom_mapping) < 3:
-            for round_data in self.__lineup_data:
-                # 13th column has JFR number for the first board
-                if len(round_data[12]):
-                    jfr_number = int(round_data[12])
-                    if jfr_number:
-                        # 5th and 6th - actual board number
-                        for board_number in range(int(round_data[5]),
-                            int(round_data[6])+1):
-                            self.__board_number_mapping[board_number] = \
-                                jfr_number + board_number - int(round_data[5])
-        else:
-            for jfr_number in range(custom_mapping[0], custom_mapping[1]+1):
-                self.__board_number_mapping[
-                    jfr_number - custom_mapping[0] + custom_mapping[2]
-                ] = jfr_number
-        # only include these board numbers from custom mapping
+        for round_data in self.__lineup_data:
+            # 13th column has JFR number for the first board
+            if len(round_data[12]):
+                jfr_number = int(round_data[12])
+                if jfr_number:
+                    # 5th and 6th - actual board number
+                    for board_number in range(int(round_data[5]),
+                                              int(round_data[6])+1):
+                        board_string = '_'.join([
+                            str(board_number),
+                            str(round_data[2]),    # round number
+                            str(round_data[0]),    # sector number
+                            str(round_data[1])])   # table number
+                        self.__board_number_mapping[
+                            board_string] = jfr_number + board_number - \
+                                            int(round_data[5])
+        # only include these board numbers from mapping
         # which actually exist in JFR output
         custom_files = []
         for board_number, jfr_number in self.__board_number_mapping.iteritems():
@@ -155,7 +156,7 @@ class JFRBidding:
     # BWS number -> JFR number mapping
     __board_number_mapping = {}
 
-    def __init__(self, bidding_file, lineup_file, file_prefix, board_mapping):
+    def __init__(self, bidding_file, lineup_file, file_prefix):
         self.__lineup_data = self.__csv_to_list(lineup_file)
         self.__round_lineups = self.__parse_lineup_data(self.__lineup_data)
         self.__bids = self.__parse_bidding_data(
@@ -164,7 +165,8 @@ class JFRBidding:
             path.realpath(file_prefix + '.html'))[0]
         self.__tournament_files_match = re.compile(
             re.escape(self.__tournament_prefix) + '([0-9]{3})\.html')
-        self.__map_board_numbers(board_mapping)
+        self.__map_board_numbers()
+        print json.dumps([self.__bids, self.__board_number_mapping])
 
     def write_bidding_tables(self):
         for board_no, board_data in self.__bids.items():
@@ -286,18 +288,13 @@ if __name__ == '__main__':
                                  help='CSV containing lineup data from BWS')
     argument_parser.add_argument('path', metavar='PATH',
                                  help='tournament path with JFR prefix')
-    argument_parser.add_argument('board_mapping', metavar='BOARD_MAPPING',
-                                 default=[], nargs='*', type=int,
-                                 help='board number mapping ' +
-                                 '(JFR_FROM JFR_TO BWS_FROM)')
 
     arguments = argument_parser.parse_args()
 
     bidding_parser = JFRBidding(
         bidding_file=arguments.bidding_file,
         lineup_file=arguments.lineup_file,
-        file_prefix=arguments.path,
-        board_mapping=arguments.board_mapping
+        file_prefix=arguments.path
     )
     bidding_parser.write_bidding_tables()
     bidding_parser.write_bidding_scripts()
-- 
cgit v1.2.3