#!/usr/bin/python # -*- coding: UTF-8 -*- from flask import Blueprint, session, current_app, request, jsonify import json import config from utils.decorator import login_required, admin_required from utils.template import my_render_template from utils.sql import sql_insert_generate from NIST.fingerprint.labels import FINGER_POSITION_CODE, PALM_POSITION_CODE segments_position_code = dict( FINGER_POSITION_CODE, **PALM_POSITION_CODE ) afis_view = Blueprint( "afis", __name__, template_folder = "templates" ) @afis_view.route( "/admin/afis/list" ) @admin_required def admin_list_folders(): return "ok" @afis_view.route( "/afis/list" ) @login_required def list_folders(): user_id = session.get( "user_id", None ) sql = """ SELECT cnm_assignment.folder_uuid, tmp.* FROM cnm_assignment LEFT JOIN cnm_folder ON cnm_assignment.folder_uuid = cnm_folder.folder_uuid LEFT JOIN ( SELECT DISTINCT ON ( donor_id, pc ) * FROM donor_segments_v ) AS tmp ON cnm_folder.donor_id = tmp.donor_id AND cnm_folder.pc = tmp.pc WHERE cnm_assignment.user_id = %s ORDER BY tmp.donor_id ASC, tmp.pc ASC """ folder_list = config.db.query_fetchall( sql, ( user_id, ) ) return my_render_template( "afis/folder_list.html", folder_list = folder_list ) @afis_view.route( "/admin/target/" ) @admin_required def admin_show_target( uuid ): return show_folder_inner( uuid, True ) @afis_view.route( "/afis/" ) @login_required def show_folder( uuid ): return show_folder_inner( uuid, False ) def get_segment_list_for_target_folder( uuid ): sql = """ SELECT cnm_assignment.folder_uuid, donor_segments_v.* FROM cnm_assignment LEFT JOIN cnm_folder ON cnm_assignment.folder_uuid = cnm_folder.folder_uuid LEFT JOIN fingers_same ON cnm_folder.pc = fingers_same.base_finger RIGHT JOIN donor_segments_v ON cnm_folder.donor_id = donor_segments_v.donor_id AND fingers_same.target = donor_segments_v.pc WHERE cnm_assignment.folder_uuid = %s ORDER BY donor_segments_v.donor_id ASC, donor_segments_v.pc ASC """ return config.db.query_fetchall( sql, ( uuid, ) ) def get_annotation_list_for_target_folder( uuid ): sql = """ SELECT uuid FROM cnm_data left join cnm_data_type ON cnm_data.type_id = cnm_data_type.id WHERE folder_uuid = %s AND cnm_data_type.name = 'annotation' """ return config.db.query_fetchall( sql, ( uuid, ) ) def show_folder_inner( uuid, admin ): segments_list = get_segment_list_for_target_folder( uuid ) annotation_list = get_annotation_list_for_target_folder( uuid ) if admin: sql = """ SELECT submissions.uuid, cnm_folder.pc, users.username FROM cnm_folder INNER JOIN submissions ON cnm_folder.donor_id = submissions.donor_id INNER JOIN users ON cnm_folder.donor_id = users.id WHERE cnm_folder.folder_uuid = %s """ submission_id, pc, username = config.db.query_fetchone( sql, ( uuid, ) ) finger_name = "{} (F{})".format( segments_position_code[ pc ], pc ) sql = """ SELECT users.id, users.username FROM users LEFT JOIN account_type ON users.type = account_type.id WHERE account_type.name = 'AFIS' """ all_afis_users = config.db.query_fetchall( sql ) def get_user_assined( assignment_type ): sql = """ SELECT cnm_assignment.user_id AS id FROM cnm_assignment LEFT JOIN cnm_assignment_type ON cnm_assignment.assignment_type = cnm_assignment_type.id WHERE cnm_assignment.folder_uuid = %s AND cnm_assignment_type.name = '{}' """.format( assignment_type ) return config.db.query_fetchall( sql, ( uuid, ) ) users_assigned_refs = get_user_assined( "reference" ) users_assigned_marks = get_user_assined( "mark" ) else: submission_id = None finger_name = None username = None all_afis_users = None users_assigned_refs = [] users_assigned_marks = [] return my_render_template( "shared/segment.html", target_uuid = uuid, segments_list = segments_list, annotation_list = annotation_list, submission_id = submission_id, username = username, finger_name = finger_name, all_afis_users = all_afis_users, users_assigned_refs = users_assigned_refs, users_assigned_marks = users_assigned_marks ) @afis_view.route( "/admin//target/list" ) @admin_required def admin_show_target_list( uuid ): sql = """ SELECT DISTINCT ON ( donor_segments_v.pc ) donor_segments_v.*, cnm_folder.folder_uuid FROM donor_segments_v LEFT JOIN submissions ON submissions.donor_id = donor_segments_v.donor_id LEFT JOIN cnm_folder ON donor_segments_v.donor_id = cnm_folder.donor_id AND donor_segments_v.pc = cnm_folder.pc WHERE submissions.uuid = %s """ segments_list = config.db.query_fetchall( sql, ( uuid, ) ) return my_render_template( "admin/folder_list.html", segments_list = segments_list, segments_position_code = segments_position_code ) @afis_view.route( "/admin/afis//user/update", methods = [ "POST" ] ) @admin_required def admin_update_users_in_afis_folder( target_uuid ): try: users = request.form.get( "users" ) users = json.loads( users ) assignment_type = request.form.get( "type" ) sql = "SELECT id FROM cnm_assignment_type WHERE name = %s" assignment_type_id = config.db.query_fetchone( sql, ( assignment_type, ) )[ "id" ] sql = """ DELETE FROM cnm_assignment WHERE folder_uuid = %s AND assignment_type = %s """ config.db.query( sql, ( target_uuid, assignment_type_id, ) ) sql = sql_insert_generate( "cnm_assignment", [ "folder_uuid", "user_id", "assignment_type" ], "id" ) for user in users: config.db.query_fetchone( sql, ( target_uuid, user, assignment_type_id, ) ) config.db.commit() return jsonify( { "error": False } ) except: return jsonify( { "error": True } )