def run_search(self, startDate, track, endDate, writeDir):
        '''
        Main searching method. This will set off a scrape that will end with 
        the report being written.
        '''
        #List for the race objects
        meetingResults = []

        #Set up a racedate datetime object for comparing dates
        startDateObj = self.build_date_obj(startDate)
        if endDate == "1":
            endDateObj = startDateObj
            endDateObj += datetime.timedelta(days=1)
        else:
            endDateObj = self.build_date_obj(endDate)
            
        dates = self.get_dates(startDateObj, endDateObj)

        #Get urls to query
        queryUrls = self.get_query_urls(dates, track)

        #print queryUrls
        for t, urls in queryUrls.iteritems():
            for u in urls:
                
                content = self.get_page_content(u)

                if content is None:
                    continue
                
                trackNameEls, goingAllowances, forecasts, tricasts = \
                    self.get_track_info_elements(content, t)
                
                #We can assume that our track name matches.
                #Scrape the race and date
                for name, allowance, fcast, tcast in zip(
                        trackNameEls, goingAllowances, forecasts, tricasts):
                    raceDate, race, grade, distance, goingAllowance, \
                        forecast,tricast, dogs = self.get_race_info(name, 
                            allowance, fcast, tcast)
                    
                    raceResult = Race(t, raceDate, race, grade, distance, 
                                      goingAllowance, forecast, tricast, dogs)
                    meetingResults.append(raceResult)
                    
                generator = ReportGenerator(os.getcwd(), writeDir)
                generator.generate_report(meetingResults)
                meetingResults = []
                
                if len(urls) > 1:
                    #Don't get too greedy
                    print("Going to sleep for 5 seconds")
                    sleep(5)
Example #2
0
class Checkstyle:
    def __init__(self, strategy):
        self.report_generator = ReportGenerator(strategy)

    @timing
    def perform_checkstyle(self, inspected_dir):
        issues = []
        for root, directories, file_names in os.walk(inspected_dir):
            for filename in file_names:
                file_name_match = GOSU_FILE_NAME_REG.search(filename)
                if file_name_match:

					#use one of below
                    inspector = FileInspector(root, filename)
                    #inspector = BlamingFileInspector(root, filename)

                    issues += inspector.inspect()

        self.report_generator.generate(issues)
Example #3
0
    def __init__(self):
        self.func_table = {
            "SetParam": self._invoke_set_params,
            "Generate": self._invoke_report_generate
        }

        self.backend_entry_point = SettingMapper.query.get(
            'backend_entry_point').value

        # Windowsとそれ以外でマウント先を変更する
        if os.name == 'nt':
            mount_dst_path = Path(
                SettingMapper.query.get('mount_src_path').value)
        else:
            mount_dst_path = Path(
                SettingMapper.query.get('mount_dst_path').value)
        self.report_home_path = mount_dst_path / 'report'

        self._initialize_report_dir(self.report_home_path)
        self.report_generator = ReportGenerator(
            home_path=str(self.report_home_path) + os.sep)

        self.backend_report_home = mount_dst_path / 'backend' / 'report_gen'
Example #4
0
 def __init__(self, strategy):
     self.report_generator = ReportGenerator(strategy)
Example #5
0
class ReportGeneratorService:
    def __init__(self):
        self.func_table = {
            "SetParam": self._invoke_set_params,
            "Generate": self._invoke_report_generate
        }

        self.backend_entry_point = SettingMapper.query.get(
            'backend_entry_point').value

        # Windowsとそれ以外でマウント先を変更する
        if os.name == 'nt':
            mount_dst_path = Path(
                SettingMapper.query.get('mount_src_path').value)
        else:
            mount_dst_path = Path(
                SettingMapper.query.get('mount_dst_path').value)
        self.report_home_path = mount_dst_path / 'report'

        self._initialize_report_dir(self.report_home_path)
        self.report_generator = ReportGenerator(
            home_path=str(self.report_home_path) + os.sep)

        self.backend_report_home = mount_dst_path / 'backend' / 'report_gen'

    def _initialize_report_dir(self, path):
        # workdirを作成
        if path.exists():
            remove_tree(str(path))
        path.mkdir(parents=True, exist_ok=True)
        # templateをコピー
        copy_src_dir = Path(__file__).joinpath('../../../report/template')
        copy_dst_dir = path / 'template'
        if copy_dst_dir.exists():
            remove_tree(str(copy_dst_dir))
        copy_tree(src=str(copy_src_dir.resolve()),
                  dst=str(copy_dst_dir.resolve()))

    def _invoke_set_params(self,
                           request: PostReportGeneratorReq,
                           _=None) -> {}:
        # 先頭のdestinationのみ反映
        td_id = int(request.destination[0])
        td = TestDescriptionMapper.query.get(td_id)
        if td.run is not None:
            for td_graph in td.run.graphs:
                param_graphs = [
                    g for g in request.params.graphs if g.id_ == td_graph.id
                ]
                if len(param_graphs) > 0:
                    param_graph = param_graphs[0]
                    td_graph.report_required = param_graph.report_required
                    if param_graph.report_required:
                        td_graph.report_index = param_graph.report_index
                        td_graph.report_name = param_graph.report_name
                else:
                    td_graph.report_required = False

        if request.params.opinion is not None:
            td.opinion = request.params.opinion
        sql_db.session.commit()

    def _invoke_report_generate(
            self,
            request: PostReportGeneratorReq,
            test_descriptions: [TestDescriptionMapper] = None) -> {}:
        # 事前処理
        # フォルダ準備
        dt_now_jst = datetime.now(timezone(
            timedelta(hours=9))).strftime('%Y%m%d%H%M%S')
        base_dir = self.backend_report_home / dt_now_jst
        in_dir = base_dir / 'in'
        in_dir.mkdir(parents=True)
        out_dir = base_dir / 'out'
        out_dir.mkdir(parents=True)

        # 入力JSON作成
        in_json = {}
        target_td_ids = []
        # 以下条件を除外したtarget_td_idsを作る
        # 既に削除済み, 未実行(None)、実行時失敗(ERR)
        if len(request.destination) == 0:
            # test_descriptionsは既に削除済みTDを除外したリスト
            target_td_ids = [
                td.id for td in test_descriptions
                if td.run and td.run.result != 'ERR'
            ]
        else:
            tmp_td_ids = [int(td_id) for td_id in request.destination]
            for td_id in tmp_td_ids:
                td = TestDescriptionMapper.query\
                    .filter(TestDescriptionMapper.id == td_id)\
                    .filter(TestDescriptionMapper.delete_flag == False).first()
                if td.run and td.run.result != 'ERR':
                    target_td_ids.append(td_id)
        if len(target_td_ids) == 0:
            raise QAINotFoundException(
                'D14004', 'these test description is not running')

        file_path_list = []
        type_list = []
        quality_props_list = []
        td_id__list = []
        required_list = []
        report_name = []
        for td_id in target_td_ids:
            td = TestDescriptionMapper.query.get(td_id)
            if td.run_id is None:
                raise QAINotFoundException(
                    'D14002', 'test description\'s result is None')

            # opinionファイル出力
            if len(td.opinion) != 0:
                opinion_path = in_dir / ('opinion' + str(td_id) + ".txt")
                with open(str(opinion_path), mode='w', encoding='utf-8') as f:
                    f.write(td.opinion)
                file_path_list.append(str(opinion_path))
                type_list.append('text')
                quality_props_list.append(td.quality_dimension_id)
                td_id__list.append(str(td_id))
                required_list.append(True)
                report_name.append('Opinion')

            graphs = GraphMapper.query.\
                filter(GraphMapper.run_id == td.run_id).\
                filter(GraphMapper.report_required == True).\
                order_by(asc(GraphMapper.report_index)).\
                all()

            for graph in graphs:
                file_path_list.append(graph.download.path)
                type_list.append(graph.graph_template.resource_type.type)
                quality_props_list.append(td.quality_dimension_id)
                td_id__list.append(str(td_id))
                required_list.append(graph.report_required)
                report_name.append(graph.report_name)

        in_json['filepath'] = dict(
            zip(range(len(file_path_list)), file_path_list))
        in_json['type'] = dict(zip(range(len(type_list)), type_list))
        in_json['quality_props'] = dict(
            zip(range(len(quality_props_list)), quality_props_list))
        in_json['testDescriptionID'] = dict(
            zip(range(len(td_id__list)), td_id__list))
        in_json['required'] = dict(
            zip(range(len(required_list)), required_list))
        in_json['name'] = dict(zip(range(len(report_name)), report_name))
        in_json_path = in_dir / 'input.json'
        with open(str(in_json_path), 'w', encoding='utf-8') as f:
            json.dump(in_json, f, indent=4, ensure_ascii=False)

        # レポート生成
        pdf_file_path = self.report_home_path / 'work' / 'report.pdf'
        pdf_file = self.report_generator.report_generate(
            sql_db, str(in_json_path), str(pdf_file_path))
        if not pdf_file or not Path(pdf_file).exists():
            raise QAINotFoundException('D16000', 'failed report generate')

        # 事後処理
        res = {}
        try:
            dst_path = out_dir / Path(pdf_file).name
            shutil.copy(src=pdf_file, dst=str(dst_path))
            dl = DownloadMapper(path=pdf_file)
            sql_db.session.add(dl)
            sql_db.session.commit()
            res['ReportUrl'] = self.backend_entry_point + '/download/' + str(
                dl.id)
        except Exception as e:
            print('Exception: {}'.format(e))
            sql_db.session.rollback()
            raise e
        return res

    @log(logger)
    def post(self, organizer_id: str, ml_component_id: int,
             request: PostReportGeneratorReq) -> PostReportGeneratorRes:
        test = TestMapper.query.\
                          filter(TestMapper.ml_component_id == ml_component_id).\
                          filter(MLComponentMapper.org_id == organizer_id).first()
        if test is None:
            raise QAINotFoundException('D14000', 'not found test descriptions')

        if request.command not in self.func_table:
            raise QAIBadRequestException('D10001', 'invaid command')

        # delete_flagがTrueのTDを除外したTestDescriptionMapperを作る
        mapper = TestDescriptionMapper.query. \
            filter(TestDescriptionMapper.test_id == test.id). \
            filter(TestDescriptionMapper.delete_flag == False). \
            all()
        if not mapper:
            raise QAINotFoundException('D14001',
                                       'test descriptions are all deleted')

        try:
            func = self.func_table[request.command]
            out_params = func(request, mapper)
        except Exception as e:
            print('Exception: {}'.format(e))
            sql_db.session.rollback()
            raise e

        return PostReportGeneratorRes(result=Result(
            code='D12000', message="command invoke success."),
                                      out_params=out_params)