
    Vh>                         d dl mZmZmZ eZdZdZdZd dl	m
Z
 d dlmZ d dlmZmZmZmZmZ  G d d	e      Zd
 Zd Zd Zedk(  r e        yy)    )absolute_importdivisionprint_functiona  
module: gitlab_label
short_description: Creates/updates/deletes GitLab Labels belonging to project or group
version_added: 8.3.0
description:
  - When a label does not exist, it will be created.
  - When a label does exist, its value will be updated when the values are different.
  - Labels can be purged.
author:
  - "Gabriele Pongelli (@gpongelli)"
requirements:
  - python-gitlab python module
extends_documentation_fragment:
  - community.general.auth_basic
  - community.general.gitlab
  - community.general.attributes

attributes:
  check_mode:
    support: full
  diff_mode:
    support: none

options:
  state:
    description:
      - Create or delete project or group label.
    default: present
    type: str
    choices: ["present", "absent"]
  purge:
    description:
      - When set to V(true), delete all labels which are not mentioned in the task.
    default: false
    type: bool
    required: false
  project:
    description:
      - The path and name of the project. Either this or O(group) is required.
    required: false
    type: str
  group:
    description:
      - The path of the group. Either this or O(project) is required.
    required: false
    type: str
  labels:
    description:
      - A list of dictionaries that represents gitlab project's or group's labels.
    type: list
    elements: dict
    required: false
    default: []
    suboptions:
      name:
        description:
          - The name of the label.
        type: str
        required: true
      color:
        description:
          - The color of the label.
          - Required when O(state=present).
        type: str
      priority:
        description:
          - Integer value to give priority to the label.
        type: int
        required: false
        default:
      description:
        description:
          - Label's description.
        type: str
        default:
      new_name:
        description:
          - Optional field to change label's name.
        type: str
        default:
a%	  
# same project's task can be executed for group
- name: Create one Label
  community.general.gitlab_label:
    api_url: https://gitlab.com
    api_token: secret_access_token
    project: "group1/project1"
    labels:
      - name: label_one
        color: "#123456"
    state: present

- name: Create many group labels
  community.general.gitlab_label:
    api_url: https://gitlab.com
    api_token: secret_access_token
    group: "group1"
    labels:
      - name: label_one
        color: "#123456"
        description: this is a label
        priority: 20
      - name: label_two
        color: "#554422"
    state: present

- name: Create many project labels
  community.general.gitlab_label:
    api_url: https://gitlab.com
    api_token: secret_access_token
    project: "group1/project1"
    labels:
      - name: label_one
        color: "#123456"
        description: this is a label
        priority: 20
      - name: label_two
        color: "#554422"
    state: present

- name: Set or update some labels
  community.general.gitlab_label:
    api_url: https://gitlab.com
    api_token: secret_access_token
    project: "group1/project1"
    labels:
      - name: label_one
        color: "#224488"
    state: present

- name: Add label in check mode
  community.general.gitlab_label:
    api_url: https://gitlab.com
    api_token: secret_access_token
    project: "group1/project1"
    labels:
      - name: label_one
        color: "#224488"
    check_mode: true

- name: Delete Label
  community.general.gitlab_label:
    api_url: https://gitlab.com
    api_token: secret_access_token
    project: "group1/project1"
    labels:
      - name: label_one
    state: absent

- name: Change Label name
  community.general.gitlab_label:
    api_url: https://gitlab.com
    api_token: secret_access_token
    project: "group1/project1"
    labels:
      - name: label_one
        new_name: label_two
    state: absent

- name: Purge all labels
  community.general.gitlab_label:
    api_url: https://gitlab.com
    api_token: secret_access_token
    project: "group1/project1"
    purge: true

- name: Delete many labels
  community.general.gitlab_label:
    api_url: https://gitlab.com
    api_token: secret_access_token
    project: "group1/project1"
    state: absent
    labels:
      - name: label-abc123
      - name: label-two
a"  
labels:
  description: Four lists of the labels which were added, updated, removed or exist.
  returned: success
  type: dict
  contains:
    added:
      description: A list of labels which were created.
      returned: always
      type: list
      sample: ['abcd', 'label-one']
    untouched:
      description: A list of labels which exist.
      returned: always
      type: list
      sample: ['defg', 'new-label']
    removed:
      description: A list of labels which were deleted.
      returned: always
      type: list
      sample: ['defg', 'new-label']
    updated:
      description: A list pre-existing labels whose values have been set.
      returned: always
      type: list
      sample: ['defg', 'new-label']
labels_obj:
  description: API object.
  returned: success
  type: dict
)AnsibleModule)basic_auth_argument_spec)auth_argument_specgitlab_authenticationensure_gitlab_package
find_groupfind_projectc                   *    e Zd Zd Zd Zd Zd Zd Zy)GitlabLabelsc                 L    || _         |r|n|| _        |rdnd| _        || _        y )NTF)_gitlabgitlab_objectis_group_label_module)selfmodulegitlab_instancegroup_id
project_ids        r/home/dcms/DCMS/lib/python3.12/site-packages/ansible_collections/community/general/plugins/modules/gitlab_label.py__init__zGitlabLabels.__init__   s(    &)1Xz&.dE    c                     d}g }| j                   j                  j                  |      }t        |      dkD  r?||z  }|dz  }| j                   j                  j                  |      }t        |      dkD  r?|S )N   )pager   )r   labelslistlen)r   page_nbr   	vars_pages       r   list_all_labelszGitlabLabels.list_all_labels   s~    &&--222@	)nq iFqLG**1166G6DI )nq  r   c                 x   | j                   j                  ry|j                  d      |j                  d      d}|j                  d      |j                  d      |d<   |j                  d      |j                  d      |d<   | j                  j                  j                  |      }d|j                         fS )NTTnamecolor)r'   r(   descriptionpriorityT)r   
check_modegetr   r   createasdict)r   var_objvar_objs       r   create_labelzGitlabLabels.create_label   s    <<"" KK'[[)

 ;;}%1!(]!;C;;z".%kk*5C
O!!((//4T[[]""r   c                    | j                   j                  ry| j                  j                  j	                  |j	                  d            }|j	                  d      |j	                  d      |_        |j	                  d      |j	                  d      |_        |j	                  d      |j	                  d      |_        |j	                  d      |j	                  d      |_        |j                          d|j                         fS )Nr&   r'   new_namer)   r*   r(   T)r   r+   r   r   r,   r4   r)   r*   r(   saver.   r   r/   _labels      r   update_labelzGitlabLabels.update_label
  s    <<""##**..w{{6/BC;;z".%kk*5FO;;}%1!(]!;F;;z".%kk*5FO;;w+";;w/FL 	V]]_$$r   c                     | j                   j                  ry| j                  j                  j	                  |j	                  d            }|j                          d|j                         fS )Nr&   r'   T)r   r+   r   r   r,   deleter.   r6   s      r   delete_labelzGitlabLabels.delete_label  sQ    <<""##**..w{{6/BCV]]_$$r   N)__name__
__module____qualname__r   r$   r2   r8   r;    r   r   r   r      s    #$%&%r   r   c                 f   t               }t               }t               }|dk(  rt               }|D ]$  }|j                  d|j                  d      i       & | D ]R  }||v r|j                  |       d|j                  d      i}	|	|v r|j                  |       B|j                  |       T |||fS )Npresentr'   )r    appendr,   )
requested_labelsexisting_labelsstate	untouchedupdatedadded_existing_labelsitemr0   compare_items
             r   comparerL   &  s     IfGFE	6# 	@D##VTXXf-=$>?	@ $ 	&Co%  % &8#33NN3'LL%	& gu$$r   c                    d}t        g g g g       t        g g g       }| j                         D cg c]  }|j                          }}|D ]b  }	|	j                  d      d|	d<   |	j                  d      d |	d<   |	j                  d      d |	d<   | j                  sR|	j                  d       d |D ]`  }	|	j                  d       |	j                  d	       |	j                  d
       |	j                  d       d|	v r|	j                  d       d |	d<   b |dk(  r|D cg c]	  }||vs| }
}|
D ]A  }		 | j                  |	      \  }}|r(d   j                  |	       |d   j                  |       C |r| j                         }|D ]A  }	| j                  |	      \  }}|sd   j                  |	       |d   j                  |       C n|dk(  r|sp|D cg c]  }|d   	 }}|D cg c]  }|d   |v s| }}|D ]A  }	| j                  |	      \  }}|sd   j                  |	       |d   j                  |       C nF|D ]A  }	| j                  |	      \  }}|sd   j                  |	       |d   j                  |       C |j                  r#t        |||      \  }}}t        ||d   |      t        fddD              rd}| j                         D cg c]  }|j                          }}||||fS c c}w c c}w # t        $ rB | j                  |	      \  }}|r(d   j                  |	       |d   j                  |       Y &w xY wc c}w c c}w c c}w )NFrH   rG   removedrF   )rH   rG   rO   r)    r4   r*   iddescription_html
text_color
subscribedis_project_labelrA   rH   rG   rO   absentr'   c              3   (   K   | ]	  }|     y w)Nr?   ).0xreturn_values     r   	<genexpr>z%native_python_main.<locals>.<genexpr>  s     
Dq<?
Ds   )rH   rO   rG   T)dictr$   r.   r,   r   popr2   rB   	Exceptionr8   r;   r+   rL   any)this_gitlabpurgerC   rE   r   change
return_objrY   labels_beforerJ   add_or_update_rvr1   _labels_label_names_requestedremove_requested
_untouched_updated_addedlabels_afterrZ   s                       @r   native_python_mainrn   D  s   Fb"bBGLBB7J)4)D)D)FGAQXXZGMG ! !88M"*"$D88J'#D88J'#D %%HHZ !  	 #$%HH'(Z	  	$4Oq8NOO! 	7D
7'44T:	T )006w'..t4	7 !113G% 7'44T:	T +2248y)006	7 
(	9I%JAai%J"%J+8`aAfII_<_``( 7'44T:	T +2248y)006	7 & 7'44T:	T +2248y)006	7 './?PU'V$
Hf&(LQZD[gqr

D$C
DD(3(C(C(EF1AHHJFLF<jHH[ H8 P  7'44T:	T +2248y)0067& &K`( Gs<   L!	L
+L
7>LM.M";M"%M'AMMc                     t               } | j                  t                      | j                  t        ddd       t        ddd       t        ddd      t        dddt	               t        t        dd      t        dd      t        dd      t        d	d      t        dd      
            t        ddddg             t        | ddgddgddgddgddgddggddggg dddggd      }t        |       |j                  d   }|j                  d   }|j                  d   }|j                  d   }|j                  d   }t        |d      }t        ||      }t        ||      }	|s4|	s2|r|s|j                  d|z         |r|	s|j                  d |z         t        |||	|!      }
|dk(  rU|
j                         D cg c]  }|j                         d"    c}t        fd#|D              r|j                  d$       t!        |
||||      \  }}}}}|j"                  s|D cg c]	  }||v s| c}|d%<   |d&   D cg c]  }|j%                  d"       }}|d'   D cg c]  }|j%                  d"       }}|d(   D cg c]  }|j%                  d"       }}|d%   D cg c]  }|j%                  d"       }}t        ||||)      }|j'                  |||*       y c c}w c c}w c c}w c c}w c c}w c c}w )+NstrF)typerequireddefaultboolr    r\   T)rq   rr   int)r'   r(   r)   r*   r4   )rq   elementsrr   rs   optionsrA   rV   )rq   rs   choices)projectgroupra   r   rE   api_username	api_tokenapi_oauth_tokenapi_job_tokenry   rz   api_password)r{   r|   r}   r~   )argument_specmutually_exclusiverequired_togetherrequired_one_ofsupports_check_modera   r   rE   z3.2.0)min_versionzproject '%s' not found.)msgzgroup '%s' not found.)r   r   r   r   r'   c              3   P   K   | ]  }|d    du xr |d   du xr |d   v  yw)r(   Nr4   r'   r?   )rX   rY   rI   s     r   r[   zmain.<locals>.<genexpr>  s;     vfgqzT!aa
mt&;a&	Qa@aavs   #&z*color parameter is required for new labelsrF   rH   rG   rO   rN   )changedr   
labels_obj)r   updater   r\   r    r   r
   paramsr	   r   r   	fail_jsonr   r$   r.   r_   rn   r+   r,   	exit_json)r   r   gitlab_projectgitlab_groupra   
label_listrE   r   gitlab_project_idgitlab_group_idr`   rY   rb   raw_return_valuebeforeafterr1   rH   rG   rO   rF   rZ   rI   s                         @r   mainr     sE   ,.M+-.%%>t<>&5$& !ut<">$(ee$D!%55!A!%55!AD y8Y:OP   #[)./_-+,/* 
 ^,
 N 
 !#F& &!]]9-N==)LMM'"Ex(JMM'"E+FHO %_nE !,?O _"3!:^!KL!8<!GHfoXg*;=K 	8C8S8S8UV1AHHJv.V vkuvv!MN4F{TY[eglnt4u1FfeT4:(Iqa5j(I%$4W$=>qQUU6]>E>&6y&ABquuV}BGB&6y&ABquuV}BGB(8(EF1vFIFeWgQZ[L
VLTJ# W )J>BBFs*   
K.2	K3<K3K8.K=L0L__main__N)
__future__r   r   r   rq   __metaclass__DOCUMENTATIONEXAMPLESRETURNansible.module_utils.basicr   ansible.module_utils.apir   Aansible_collections.community.general.plugins.module_utils.gitlabr   r	   r
   r   r   objectr   rL   rn   r   r<   r?   r   r   <module>r      su    A @Pf_B
@ 5 = 
=%6 =%@%<RIjQKh zF r   