Skip to content
__init__.py 8.59 KiB
Newer Older
#!/usr/bin/python
# -*- coding: UTF-8 -*-

from flask import Blueprint, session, current_app, request, jsonify
import json
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" )
def admin_list_folders():
Marco De Donno's avatar
Marco De Donno committed
    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/<uuid>" )
@admin_required
def admin_show_target( uuid ):
    return show_folder_inner( uuid, True )

@afis_view.route( "/afis/<uuid>" )
def show_folder( uuid ):
    return show_folder_inner( uuid, False )

def get_segment_list_for_target_folder( uuid, admin = True ):
    if not admin:
        sql = """
            SELECT count(*) AS count
            FROM cnm_assignment
            LEFT JOIN cnm_assignment_type ON cnm_assignment.assignment_type = cnm_assignment_type.id
            WHERE
                folder_uuid = %s AND
                user_id = %s AND
                cnm_assignment_type.name = 'reference'
        """
        if config.db.query_fetchone( sql, ( uuid, session.get( "user_id", False ), ) )[ "count" ] == 0:
            return None
        
    sql = """
        SELECT
            donor_segments_v.*
        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
        ORDER BY
            donor_segments_v.donor_id ASC,
            donor_segments_v.pc ASC
    """
def get_marks_list_for_target_foler( uuid, admin = True ):
    if not admin:
        sql = """
            SELECT count(*) AS count
            FROM cnm_assignment
            LEFT JOIN cnm_assignment_type ON cnm_assignment.assignment_type = cnm_assignment_type.id
            WHERE
                folder_uuid = %s AND
                user_id = %s AND
                cnm_assignment_type.name = 'mark'
        """
        if config.db.query_fetchone( sql, ( uuid, session.get( "user_id", False ), ) )[ "count" ] == 0:
            return None
        
    sql = """
        SELECT
            files_v.uuid
        FROM cnm_folder
        LEFT JOIN submissions ON cnm_folder.donor_id = submissions.donor_id
        LEFT JOIN files_v ON submissions.id = files_v.folder
        LEFT JOIN files_type ON files_v.type = files_type.id
        WHERE
            cnm_folder.folder_uuid = %s AND
            files_type.name = 'mark_target'
    """
    return config.db.query_fetchall( sql, ( uuid, ) )

def get_annotation_list_for_target_folder( uuid, admin = True ):
    sql = """
        SELECT uuid
        FROM cnm_data
Marco De Donno's avatar
Marco De Donno committed
        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, admin )
    annotation_list = get_annotation_list_for_target_folder( uuid, admin )
    marks_list = get_marks_list_for_target_foler( uuid, admin )
    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
        users_assigned_refs = []
        users_assigned_marks = []
    return my_render_template(
        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/<uuid>/target/list" )
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, ) )
    
    sql = """
        SELECT username
        FROM users
        LEFT JOIN submissions ON users.id = submissions.donor_id
        WHERE submissions.uuid = %s
    """
    username = config.db.query_fetchone( sql, ( uuid, ) )[ "username" ]
    
    return my_render_template(
        "admin/folder_list.html",
        segments_list = segments_list,
        segments_position_code = segments_position_code,
        username = username,
        submission_uuid = uuid
@afis_view.route( "/admin/afis/<target_uuid>/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
        } )