U
    ˱}jJ                     @   s~   d dl mZmZ d dlmZ d dlmZmZmZ d dl	m
Z
mZ d dlmZ d dlmZ d dlZdd	d
Zdd Zdd ZdS )    )requestjsonify)get_db)get_user_id_from_tokenbuild_locationget_admin_from_token)build_search_conditionserror_response)get_config_value)check_sensitive_wordsNTc                 C   sv   t  }| }zX|d| f | }|s2W :dS td|}|rHW $dS |r`|d |kr`W dS W dS |  X dS )uf   
    检查用户是否有权限操作任务
    返回 (has_permission, is_admin, error_message)
    zBSELECT publisher_id FROM tasks WHERE id = ? AND deleted_at IS NULL)FF   任务不存在N)TTNpublisher_id)FFu   无权操作此任务)TFN)r   cursorcloseexecutefetchoner   )task_iduser_idrequire_ownerconnr   taskis_admin r   :D:\Project\Python Project\BangBang\backend\routes\tasks.pycheck_task_permission	   s    
r   c           	      C   s   | si S t  }| }zddgt|  }|d| d|  | }i }|D ]H}|d dkrt|d |d  d }| d	||d
 < qPd||d
 < qP| D ]}||krd||< q|W S |  X d S )N,?a\  
            SELECT
                t.publisher_id,
                COUNT(*) as total,
                SUM(CASE WHEN tr.rating = 'good' THEN 1 ELSE 0 END) as positive_count
            FROM task_ratings tr
            JOIN tasks t ON tr.task_id = t.id
            WHERE tr.rating_type = 'acceptor_to_publisher'
              AND t.publisher_id IN (z.)
            GROUP BY t.publisher_id
        totalr   Zpositive_countd   %r   -)r   r   r   joinlenr   fetchallround)	Zuser_idsr   r   ZplaceholdersrowsZ
rating_maprowZrater   r   r   r   get_bulk_publisher_rating_rates&   s.    

r'   c                    s   | j ddgddd }| j ddgddd }| j d	dgdd
d }dd  | j ddgd fdd}| j d	dgddd }| j d	dgddd }d S )Nz
/api/tasksGET)methodsc                  S   s  t jd} t jd}t jd}tt jdd}tt jdd}|d | }t }| }zd}d	}	g }
g }| r| d
kr|d7 }|	d7 }	|
|  ||  t jd}|rp|rp|	drp|
dd }t|}|rp|dkr|d7 }|	d7 }	|
| || nZ|dkrp|d7 }|	d7 }	|
| || |d7 }|	d7 }	|
ddg |ddg |rddddddg}t||\}}|r||7 }|	|7 }	|
| || ||	| | d }|d7 }|
||g |||
 | }ttdd |D }t|}g }|D ]<}t|}t|d d!|d"< ||d# d$|d%< || q&t||||d&W S |  X d S )'Nstatustypesearchpage   limit
   z
                SELECT t.*, u.phone as publisher_phone
                FROM tasks t LEFT JOIN users u ON t.publisher_id = u.id 
                WHERE t.deleted_at IS NULL
            z7SELECT COUNT(*) FROM tasks t WHERE t.deleted_at IS NULLallz AND status = ?AuthorizationBearer  	publishedz AND publisher_id = ?acceptedz AND acceptor_id = ?z AND status IN (?, ?)in_progress	completedzt.titlezt.descriptionz
t.provincezt.cityz
t.districtzt.streetr   z* ORDER BY created_at DESC LIMIT ? OFFSET ?c                 s   s   | ]}|d  r|d  V  qdS )r   Nr   ).0r&   r   r   r   	<genexpr>   s      z:register_task_routes.<locals>.get_tasks.<locals>.<genexpr>Tinclude_detaillocationr   r    Zpublisher_rating_rate)itemsr   r-   r/   )r   argsgetintr   r   r   appendheaders
startswithsplitr   extendr   r   r   r#   listsetr'   dictr   r   )r*   
type_paramr,   r-   r/   offsetr   r   queryZcount_queryparamsZcount_paramsauth_headertokenZcurrent_user_idZsearch_fieldsZsearch_condZsearch_paramsr   r%   Zpublisher_idsZpublisher_rating_mapr>   r&   r   r   r   r   	get_tasksL   s    








z'register_task_routes.<locals>.get_tasksz/api/tasks/countc                  S   s   t jd} | r| ds$tddS | dd }t|}|sHtddS t }| }z:|
d|f | d	 }ttd
d}t||dW S |	  X d S )Nr2   r3   u	   未登录  r4   r.   u   登录已过期z
                SELECT COUNT(*) FROM tasks 
                WHERE publisher_id = ? AND status IN ('pending', 'in_progress') AND deleted_at IS NULL
            r   max_publish_tasks3)countmax)r   rC   r@   rD   r	   rE   r   r   r   r   r   r   rA   r
   r   )rN   rO   r   r   r   current_countmax_publishr   r   r   get_task_count   s"    

z,register_task_routes.<locals>.get_task_countz/api/tasks/<int:task_id>c                 S   s   t  }| }zx|d| f | }|s6tdW TS t|}t|dd|d< |drf|d |d< n|dr||d |d< t	|W S |  X d S )	Na  
                SELECT t.*, u.nickname as user_nickname, u.phone as acceptor_phone, u.avatar as acceptor_avatar,
                       pr.rating as publisher_rating, pr.comment as publisher_rating_comment, pr.created_at as publisher_rating_created_at,
                       ar.rating as acceptor_rating, ar.comment as acceptor_rating_comment, ar.created_at as acceptor_rating_created_at
                FROM tasks t 
                LEFT JOIN users u ON t.acceptor_id = u.id 
                LEFT JOIN task_ratings pr ON t.id = pr.task_id AND pr.rating_type = 'publisher_to_acceptor'
                LEFT JOIN task_ratings ar ON t.id = ar.task_id AND ar.rating_type = 'acceptor_to_publisher'
                WHERE t.id = ? AND t.deleted_at IS NULL
            r   Tr;   r=   Zuser_nicknameZacceptor_nameZacceptor_phone)
r   r   r   r   r   r	   rI   r   r@   r   )r   r   r   r&   resultr   r   r   get_task   s"    	


z&register_task_routes.<locals>.get_taskc                 S   s>   z"t j | d}t j  }||kW S  tk
r8   Y dS X d S )Nz%Y-%m-%d %H:%MF)datetimestrptimenow	Exception)Ztask_time_str	task_timeZcurrent_timer   r   r   validate_task_time   s    

z0register_task_routes.<locals>.validate_task_timePOSTc                     s@  t j} t }| }zz| d}|rB |sBtdW W S t| d| d| d| d\}}|rtdW W S t jd}d }|r:|	d	r:|
d
d }|d|f | }	|	r:|	d dkrtddW W JS |	d }|d|f | d }
ttdd}|
|kr:td| dW W S |d| d| d| d| d| d| d| d| d| d|| d| d| dd| d d!f |j}|  |d"|f | }t|}t|d#d$|d%< t|W W 6S  tk
r, } z|  |W 5 d }~X Y nX W 5 |  X d S )&Ntimeu$   任务时间必须晚于当前时间titledescriptiondetail_locationreward0   文字中存在敏感词，请修改后再发布r2   r3   r4   r.   z
                    SELECT u.id, u.enabled FROM users u
                    JOIN sessions s ON u.id = s.user_id
                    WHERE s.token = ? AND s.expires_at > datetime('now') AND u.deleted_at IS NULL
                enabledu'   账户已被禁用，无法发布任务  idz
                        SELECT COUNT(*) FROM tasks 
                        WHERE publisher_id = ? AND status IN ('pending', 'in_progress') AND deleted_at IS NULL
                    r   rR   rS   u(   待处理+进行中的任务数最多为u   个，暂时无法发布z
                INSERT INTO tasks (title, description, province, city, district, street, detail_location, time, reward, publisher_id, publisher_name, contact, status, type)
                VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
            provincecitydistrictstreetZpublisher_namecontactr*   pendingr+   r5    SELECT * FROM tasks WHERE id = ?Tr;   r=   )r   jsonr   r   r   r@   r	   r   rC   rD   rE   r   r   rA   r
   	lastrowidcommitrI   r   r   r^   rollback)datar   r   r_   foundwordrN   r   rO   userrV   rW   r   Zcreated_taskrY   er`   r   r   create_task   s~    



z)register_task_routes.<locals>.create_taskPUTc                 S   s  t jd}|r|ds$tddS |dd }t|}|sHtddS t| |dd	\}}}|sjt|d
S t j}t	|d|d|d|d\}}	|rtdS t
 }
|
 }zNz|d| f | }|stdW W "S g }g }d|kr|d ||d  d|kr2|d ||d  d|krT|d ||d  d|krv|d ||d  d|kr|d ||d  |rd|kr|d ||d  d|kr|d ||d  d|kr|d ||d  d|kr&|d  ||d  d|krH|d! ||d  d"|krj|d# ||d"  d$|kr|d% ||d$  |d&d'kr|d% || |d( |std)W W 8S ||  |d*d+| d,| |
  |d"d-kr~d.|kr~||d/ kr~|d$ r~|d0| d1f | }|s~|d2| ||d$ |d.|d3d4d1f |
  |d| f | }|rt|}t|dd5|d6< t|W W HS tdW W :S W n0 tk
r  } z|
  |W 5 d }~X Y nX W 5 |
  X d S )7Nr2   r3      请先登录rQ   r4   r.   !   登录已过期，请重新登录Tr   ri   rc   rd   re   rf   rg   rq   r   z	title = ?zdescription = ?rb   ztime = ?z
reward = ?ro   zcontact = ?rk   zprovince = ?rl   zcity = ?rm   zdistrict = ?rn   z
street = ?zdetail_location = ?r*   z
status = ?Zacceptor_idzacceptor_id = ?r+   r6   zaccept_time = datetime('now')u   没有需要更新的字段zUPDATE tasks SET z, z WHERE id = ?r8   Zratingr   z@SELECT * FROM task_ratings WHERE task_id = ? AND rating_type = ?Zpublisher_to_acceptorz
                            INSERT INTO task_ratings (task_id, publisher_id, acceptor_id, rating, comment, rating_type)
                            VALUES (?, ?, ?, ?, ?, ?)
                        Zrating_comment r;   r=   )r   rC   r@   rD   r	   rE   r   r   rr   r   r   r   r   r   r   rB   r!   rt   rI   r   r   r^   ru   )r   rN   rO   r   has_permissionr   	error_msgrv   rw   rx   r   r   r   Zupdate_fieldsZupdate_valuesZexisting_ratingZupdated_taskrY   rz   r   r   r   update_task7  s    






























 z)register_task_routes.<locals>.update_taskDELETEc           
   
   S   s   t jd}|r|ds$tddS |dd }t|}|sHtddS t| |dd	\}}}|sjt|d
S t }|	 }z^z*|d| f |  tdddW W 4S  tk
r }	 z|  |	W 5 d }	~	X Y nX W 5 |
  X d S )Nr2   r3   r~   rQ   r4   r.   r   Tr   ri   z:UPDATE tasks SET deleted_at = datetime('now') WHERE id = ?u   删除成功)successmessage)r   rC   r@   rD   r	   rE   r   r   r   r   r   r   rt   r   r^   ru   )
r   rN   rO   r   r   r   r   r   r   rz   r   r   r   delete_task  s(    


z)register_task_routes.<locals>.delete_task)route)apprP   rX   rZ   r|   r   r   r   r{   r   register_task_routesK   s    
S

S
zr   )T)flaskr   r   Zutils.databaser   Z
utils.authr   r   r   Zutils.helpersr   r	   utils.configr
   Zutils.sensitive_filterr   r[   r   r'   r   r   r   r   r   <module>   s   
%