@@ -925,18 +925,36 @@ def clean(self):
925925 super ().clean ()
926926
927927 def add (self , reader , password_length = BATCH_DEFAULT_PASSWORD_LENGTH ):
928+ RadiusUserGroup = swapper .load_model ('openwisp_radius' , 'RadiusUserGroup' )
929+ RadiusGroup = swapper .load_model ('openwisp_radius' , 'RadiusGroup' )
928930 users_list = []
929931 generated_passwords = []
932+ user_group_associations = []
933+
930934 for row in reader :
931- if len (row ) == 5 :
935+ # Both formats
936+ if len (row ) in [5 , 7 ]:
932937 user , password = self .get_or_create_user (
933938 row , users_list , password_length
934939 )
935940 users_list .append (user )
936941 if password :
937942 generated_passwords .append (password )
943+ # New format
944+ if len (row ) == 7 :
945+ radius_ugroups = row [6 ]
946+ groupnames = radius_ugroups .split (';' )
947+ for groupname in groupnames :
948+ user_group_associations .append ((user , groupname .strip ()))
938949 for user in users_list :
939950 self .save_user (user )
951+ for user , groupname in user_group_associations :
952+ if RadiusGroup .objects .filter (name = groupname ).exists ():
953+ RadiusUserGroup .objects .get_or_create (
954+ user = user ,
955+ groupname = groupname ,
956+ defaults = {'priority' : 1 }
957+ )
940958 for element in generated_passwords :
941959 username , password , user_email = element
942960 send_mail (
@@ -969,17 +987,17 @@ def prefix_add(self, prefix, n, password_length=BATCH_DEFAULT_PASSWORD_LENGTH):
969987
970988 def get_or_create_user (self , row , users_list , password_length ):
971989 User = get_user_model ()
972- username , password , email , first_name , last_name = row
990+ username , password , email , first_name , last_name , notes , radius_ugroups_string = self . _batch_csv_read_row ( row )
973991 if email and User .objects .filter (email = email ).exists ():
974992 user = User .objects .get (email = email )
975993 return user , None
976994 generated_password = None
977- username , password , email , first_name , last_name = row
995+ username , password , email , first_name , last_name , notes , radius_ugroups_string = self . _batch_csv_read_row ( row )
978996 if not username and email :
979997 username = email .split ('@' )[0 ]
980998 username = find_available_username (username , users_list )
981999 user = User (
982- username = username , email = email , first_name = first_name , last_name = last_name
1000+ username = username , email = email , first_name = first_name , last_name = last_name , notes = notes
9831001 )
9841002 cleartext_delimiter = 'cleartext$'
9851003 if not password :
@@ -1024,6 +1042,12 @@ def expire(self):
10241042 u .is_active = False
10251043 u .save ()
10261044
1045+ def _batch_csv_read_row (self , row ):
1046+ # 5 or 7 fields, for backwards compatibility with previous CSV format.
1047+ read_row = lambda row : (* row [:5 ], * row [5 :7 ], '' , '' )[:7 ]
1048+ username , password , email , first_name , last_name , notes , radius_ugroups_string = readrow (row )
1049+ return username , password , email , first_name , last_name , notes , radius_ugroups_string
1050+
10271051 def _remove_files (self ):
10281052 if self .csvfile :
10291053 self .csvfile .storage .delete (self .csvfile .name )
0 commit comments