init_accounts.py 12.1 KB
Newer Older
1 2 3 4
#!/usr/bin/env python
import sys
import os

5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
dirname = os.path.dirname(os.path.realpath(__file__))
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "gargantext.settings")

# initialize Django application
from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()


from django.contrib.auth import password_validation
from django.contrib.auth.hashers import ( check_password
                                        , is_password_usable
                                        , make_password
                                        )
from django.db import models
from django.utils.crypto import get_random_string, salted_hmac


# retrieve Django models
import django.apps
django_models = django.apps.apps.get_models()
django_models_names = set(model._meta.db_table for model in django_models)


28
from gargantext.util.db      import session
29
from gargantext.models.users import User, Contact
30
from django.core.mail        import send_mail
delanoe's avatar
delanoe committed
31
from gargantext.settings     import BASE_URL
32

33
drafts = {
34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
        'partnerOkenglish': '''
        Hello,

        You have made a request for access to the platform Gargantext.
        The ISC-PIF team has made every effort to Give you access to
        this platform in the best Time.

        We recommend that you read the conditions To use the platform
        at the address below Drawing your attention to the following
        points:

        1 - The use of this platform is reserved for an academic
        framework,

        2 - The Gargantext service is a data analysis service, And not
        storage. It is up to each user To safeguard its own data and
        results in Downloading them from the platform.

        3 - The re-use of data, graphics, analyzes and Cartographies
        generated by Gargantext in any publication And communication
        implies the explicit mention of Gargantext and Of the ISC-PIF
        CNRS as for example: "these results have been Obtained using
        Gargantext software developed by ISC-PIF / CNRS ".

        Read the full terms of use (recommended) on:
        http://gitlab.iscpif.fr/humanities/tofu/tree/master
        
        You can log on to:
                http://%s
        
        With the following identifiers:
        Your login is: %s
        Your password is: %s

        You are currently on this version stabilized for a
        unique experience in exploring your research themes.

        Your feedback will be valuable for further development
        of the platform, do not hesitate to contact us and
73 74
        to contribute on our forum:
                https://discourse.iscpif.fr/c/gargantext
75

76 77 78
        We remain at your disposal for any further information and you be
        kept updated if you subscribe to our mailing-list:
                https://phplist.iscpif.fr/?p=subscribe&id=4
79 80 81 82 83 84 85
        
        With our best regards,
        -- 
        The Gargantext Team (CNRS)


        ''',
86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126
        'partnerOk' : '''
        Bonjour,

        Vous avez fait une demande d'accès à la plate-forme
        Gargantext. L'équipe de l'ISC-PIF a tout mis en œuvre pour
        vous donner accès à cette plate-forme dans les meilleurs
        délais.

        Nous vous recommendons de prendre connaissance des conditions
        d'utilisation de la plate-forme à l'adresse ci-dessous en
        attirant votre attention sur les points suivants :

        1 - L'usage de cette plate-forme est réservé à un cadre académique,

        2 - Le service Gargantext est un service d'analyse de données,
        et non de stockage. Il appartient à chaque utilisateur
        d'assurer la sauvegarde de ses propres données et résultats en
        les téléchargeant à partir de la plate-forme.

        3 - La réutilisation des données, graphiques, analyses et
        cartographies générés par Gargantext dans toute publication
        et communication suppose la mention explicite de Gargantext et
        de l'ISC-PIF CNRS comme par exemple : "ces résultats ont été
        obtenus à l'aide de du logiciel Gargantext développé par
        ISC-PIF/CNRS".

        Lire l'intégralité des conditions d'utilisation (recommandé) sur :
        http://gitlab.iscpif.fr/humanities/tofu/tree/master
        
        Vous pouvez vous connecter à l'adresse:
                http://%s
        
        Avec les identifiants suivants:
        Votre login est: %s
        Votre mot de passe est : %s

        Vous êtes actuellement sur cette version stabilisée pour une
        expérience unique dans l'exploration de vos thèmes de recherche.

        Vos retours seront précieux pour poursuivre le développement
        de la plateforme, n'hésitez pas à nous contacter et
127 128
        contribuer sur notre forum:
                https://discourse.iscpif.fr/c/gargantext
129

130 131 132 133
        Nous restons à votre disposition pour tout complément
        d'information et vous serez informés de l'évolution des
        services en vous inscrivant à la liste:
            https://phplist.iscpif.fr/?p=subscribe&id=4
134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193

        Cordialement
        --
            L'équipe de Gargantext (CNRS)

        '''
        ,

        'partnerKo' : '''
        Bonjour,

        Vous venez de faire une demande d'accès à la plate-forme
        Gargantext, développée et hébergée grâce au soutien du CNRS
        et des partenaires de l'ISC-PIF. L'équipe de l'ISC-PIF a tout
        mis en œuvre pour vous donner accès à cette plate-forme dans
        les meilleurs délais.

        Cette plate-forme étant accessible en priorité au personnel
        des établissements partenaires de l'ISC-PIF, nous vous
        proposons un accès pour une durée de 3 mois afin que vous
        puissiez explorer les possibilités de Gargantext. S'il s'avère
        que cette plateforme correspond à vos besoins, vous pourrez
        vous prendre contact avec le service partenariat de l'ISC-PIF
        (contact@gargantext.org) pour étudier une adhésion de votre
        établissement à l'ISC-PIF ou bien vous rapprocher de votre
        établissement afin qu'il déploie une instance de Gargantext.

        Nous vous invitons à prendre connaissance des conditions
        d'utilisation de la plate-forme à l'adresse ci-dessous en
        attirant votre attention sur les points suivants :

        1 - L'usage de cette plate-forme est réservé à un cadre académique,

        2 - Le service Gargantext est un service d'analyse de données,
        et non de stockage. Il appartient à chaque utilisateur
        d'assurer la sauvegarde de ses propres données et résultats en
        les téléchargeant à partir de la plate-forme.

        3 - La réutilisation des données, graphiques, analyses et
        cartographies générés par Gargantext dans toute publication
        et communication suppose la mention explicite de Gargantext et
        de l'ISC-PIF CNRS comme par exemple : "ces résultats ont été
        obtenus à l'aide de du logiciel Gargantext développé par
        ISC-PIF/CNRS".

        Lire l'intégralité des conditions d'utilisation (recommandé) sur :
        http://gitlab.iscpif.fr/humanities/tofu/tree/master

        Vous pouvez donc vous connecter à l'adresse:
                http://%s
        
        Avec les identifiants suivants:
        Votre login est: %s
        Votre mot de passe est : %s

        Vous êtes actuellement sur cette version stabilisée pour une
        expérience unique dans l'exploration de vos thèmes de recherche.

        Vos retours seront précieux pour poursuivre le développement
        de la plateforme, n'hésitez pas à nous contacter et
194 195 196 197 198 199 200
        contribuer sur notre forum:
                https://discourse.iscpif.fr/c/gargantext

        Nous restons à votre disposition pour tout complément
        d'information et vous serez informés de l'évolution des
        services en vous inscrivant à la liste:
            https://phplist.iscpif.fr/?p=subscribe&id=4
201 202 203 204 205 206 207 208 209

        Cordialement
        --
            L'équipe de Gargantext (CNRS)

        ''' ,

        }

210 211 212 213 214 215 216 217 218 219 220 221
def make_random_password(length=10
                         , allowed_chars='abcdefghjkmnpqrstuvwxyz'
                                         'ABCDEFGHJKLMNPQRSTUVWXYZ'
                                         '0123456789'):
    """
    Generate a random password with the given length and given
    allowed_chars. The default value of allowed_chars does not have "I" or
    "O" or letters and digits that look similar -- just to avoid confusion.
    (source: django/contrib/auth)
    """
    return get_random_string(length, allowed_chars)

222 223 224 225 226 227 228
def mail2user(username, email, password, draft):
    send_mail ('[Gargantext] Votre accès à la plateforme'
              , draft % (BASE_URL, username, password)
              , 'team@gargantext.org'
              , [email]
              , fail_silently=False 
              )
229

230 231 232 233 234 235 236 237
def block(user1_id, user2_id, bool_):
    '''
    user_group :: Int -> Int -> Bool
    Link between user1 and user2
    If False: 
        link blocked
    else:
        link not blocked
238

239 240
    '''
    contact = Contact()
delanoe's avatar
delanoe committed
241
    
242 243 244
    contact.user1_id   = user1_id
    contact.user2_id   = user2_id
    contact.is_blocked = bool_
245

246 247 248 249
    session.add(contact)
    session.commit()
    
    return contact
250

251 252 253 254 255 256
def create_user(username, email, user=None, password=None, group=None, notify=False):
    '''
    create_user :
        - create user
        - create its group if needed
        - create relation between user and its group
257

258
    '''
259 260
    if user is None:
        user = User()
261
    
delanoe's avatar
delanoe committed
262 263
    user.username    = username
    user.email       = email
264 265 266 267
    user.is_active   = True
    
    # Creating the password
    if password is None or len(password) < 3 :
268 269
        password = make_random_password()
    user.password = make_password(password)
270

271 272
    session.add(user)
    session.commit()
273

274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293
    if group is not None :
        # get or create group_iscpif
        group_iscpif_id = session.query(User.id).filter(User.username=="group_iscpif").first()
        
        if group_iscpif_id is None:
            group_iscpif    = create_user("group_iscpif", "group@gargantext.org", group=None, notify=False)
            group_iscpif_id = group_iscpif.id

        if group == "group_iscpif":
            block (user.id, group_iscpif_id, False)
        else:
            block (user.id, group_iscpif_id, True)


    if notify == True and group == "group_iscpif" :
        mail2user (username, email, password, drafts['partnerOk'])
    elif notify == True :
        mail2user (username, email, password, drafts['partnerKo'])
    else:
        print("User %s created, no notification" % username)
294 295 296

    return user

297 298 299 300 301
def del_user(username):
    '''
    del_user :: String -> ()
    '''
    print("Test is True, deleting username %s" % username)
302 303
    session.query(User).filter(User.username == username).delete()

304
def active_user(username, bool_=True):
305
    '''
306 307 308 309 310
    active_user :: String -> Maybe Bool -> ()
    if bool_ == True:
        user is active
    else:
        user is not active
311 312
    '''
    user = session.query(User).filter(User.username == username).first()
313
    user.is_active = bool_
314 315
    user.save()

316 317 318 319 320 321 322 323 324
def mass_account_creation(csv_file=None, init=False, test=False, notify=False):
    '''
    CSV file as parameter:
    if partner:
        username,email@example.com,group_iscpif,password,
    else:
        username,email@example.com,group_others,password,
    '''
    accounts = open(csv_file, "r")
325
    for line in accounts.readlines():
326
        username, email, group, password, end = line.split(',')
327 328 329
        user = session.query(User).filter(User.username == username).first()

        if user is not None:
330
            if init == True:
331 332 333 334 335
                create_user(username, email, user=user, group=group, password=password, notify=notify)
                print("User %s exists and updated" % (username))
            else:
                print("User %s exists and not updated" % (username))

336
        else:
337 338 339 340 341 342 343
            create_user(username, email, group=group, password=password, notify=notify)
            print("User %s is created" % (username))
        
        if test==True:
            del_user(username)
            del_user(group)
    
344 345 346
    accounts.close()

if __name__ == "__main__":
347
    mass_account_creation(csv_file=sys.argv[1], init=False, notify=True, test=False)
348 349