How to use _receive method in autotest

Best Python code snippet using autotest_python

lammps.py

Source:lammps.py Github

copy

Full Screen

...44 None45 """46 pickle.dump({"c": command, "d": data}, self._process.stdin)47 self._process.stdin.flush()48 def _receive(self):49 """50 Receive data from the Lammps library51 Parameters52 ----------53 None54 Returns55 -------56 data : string57 data from the command58 """59 output = pickle.load(self._process.stdout)60 return output61 @property62 def version(self):63 """64 Get the version of lammps65 Parameters66 ----------67 None68 Returns69 -------70 version: string71 version string of lammps72 """73 self._send(command="get_version", data=[])74 return self._receive()75 def file(self, inputfile):76 """77 Read script from an input file78 Parameters79 ----------80 inputfile: string81 name of inputfile82 Returns83 -------84 None85 """86 if not os.path.exists(inputfile):87 raise FileNotFoundError("Input file does not exist")88 self._send(command="get_file", data=[inputfile])89 _ = self._receive()90 # TODO91 def extract_setting(self, *args):92 self._send(command="extract_setting", data=list(args))93 return self._receive()94 def extract_global(self, name):95 """96 Extract value of global simulation parameters97 Parameters98 ----------99 name : string100 see notes for a set of possible options101 Notes102 -----103 The possible options for `name` are-104 "dt", "boxlo", "boxhi", "boxxlo", "boxxhi",105 "boxylo", "boxyhi", "boxzlo", "boxzhi", "periodicity",106 "xy", "xz", "yz", "natoms", "nbonds", "nangles",107 "ndihedrals", "nimpropers", "nlocal", "nghost",108 "nmax", "ntypes", "ntimestep", "units", "triclinic",109 "q_flag", "atime", "atimestep"110 Also global constants defined by units can be accessed-111 "boltz", "hplanck", "mvv2e", "ftm2v", "mv2d",112 "nktv2p", "qqr2e", "qe2f", "vxmu2f", "xxt2kmu",113 "dielectric", "qqr2e", "e_mass", "hhmrr2e",114 "mvh2r", "angstrom", "femtosecond", "qelectron"115 """116 self._send(command="extract_global", data=[name])117 return self._receive()118 def extract_box(self):119 """120 Get the simulation box121 Parameters122 ----------123 None124 Returns125 -------126 box : list127 of the form `[boxlo,boxhi,xy,yz,xz,periodicity,box_change]` where128 `boxlo` and `boxhi` are lower and upper bounds of the box in three dimensions,129 `xy, yz, xz` are the box tilts, `periodicity` is an array which shows if130 the box is periodic in three dimensions.131 """132 self._send(command="extract_box", data=[])133 return self._receive()134 def extract_atom(self, name):135 """136 Extract a property of the atoms137 Parameters138 ----------139 name : {'x', 'mass', 'id', 'type', 'mask', 'v', 'f',140 'molecule', 'q', 'mu', 'omega', 'angmom', 'torque', 'radius'}141 the property of atom to be extracted142 Returns143 -------144 val : array of length n_atoms145 If the requested name has multiple dimensions, output146 will be a multi-dimensional array.147 Notes148 -----149 This method only gathers information from the current processor.150 Rest of the values would be zero.151 See Also152 --------153 scatter_atoms154 """155 self._send(command="extract_atom", data=list([name]))156 return self._receive()157 def extract_fix(self, *args):158 """159 Extract a fix value160 Parameters161 ----------162 id: string163 id of the fix164 style: {0, 1, 2}165 0 - global data166 1 - per-atom data167 2 - local data168 type: {0, 1, 2}169 0 - scalar170 1 - vector171 2 - array172 i: int, optional173 index to select fix output174 j: int, optional175 index to select fix output176 Returns177 -------178 value179 Fix data corresponding to the requested dimensions180 """181 self._send(command="extract_fix", data=list(args))182 return self._receive()183 def extract_variable(self, *args):184 """185 Extract the value of a variable186 Parameters187 ----------188 name: string189 name of the variable190 group: string191 group id (ignored for equal style variables)192 flag: {0, 1}193 0 - equal style variable194 1 - atom style variable195 Returns196 -------197 data198 value of variable depending on the requested dimension199 Notes200 -----201 Currently only returns the information provided on a single processor202 """203 self._send(command="extract_variable", data=list(args))204 return self._receive()205 @property206 def natoms(self):207 return self.get_natoms()208 def get_natoms(self):209 """210 Get the number of atoms211 Parameters212 ----------213 None214 Returns215 -------216 natoms : int217 number of atoms218 """219 self._send(command="get_natoms", data=[])220 return self._receive()221 def set_variable(self, *args):222 """223 Set the value of a string style variable224 Parameters225 ----------226 name: string227 name of the variable228 value: string229 value of the variable230 Returns231 -------232 flag : int233 0 if successfull, -1 otherwise234 """235 self._send(command="set_variable", data=list(args))236 return self._receive()237 def reset_box(self, *args):238 """239 Reset the simulation box240 Parameters241 ----------242 boxlo: array of floats243 lower bound of box in three dimensions244 boxhi: array of floats245 upper bound of box in three dimensions246 xy, yz, xz : floats247 box tilts248 """249 self._send(command="reset_box", data=list(args))250 _ = self._receive()251 def generate_atoms(252 self, ids=None, type=None, x=None, v=None, image=None, shrinkexceed=False253 ):254 """255 Create atoms on all procs256 Parameters257 ----------258 ids : list of ints, optional259 ids of N atoms that need to be created260 if not specified, ids from 1 to N are assigned261 type : list of atom types, optional262 type of N atoms, if not specied, all atoms are assigned as type 1263 x: list of positions264 list of the type `[posx, posy, posz]` for N atoms265 v: list of velocities266 list of the type `[vx, vy, vz]` for N atoms267 image: list of ints, optional268 if not specified a list of 0s will be used.269 shrinkexceed: bool, optional270 default False271 Returns272 -------273 None274 """275 self.create_atoms(276 ids=ids, type=type, x=x, v=v, image=image, shrinkexceed=shrinkexceed277 )278 def create_atoms(279 self, ids=None, type=None, x=None, v=None, image=None, shrinkexceed=False280 ):281 """282 Create atoms on all procs283 Parameters284 ----------285 ids : list of ints, optional286 ids of N atoms that need to be created287 if not specified, ids from 1 to N are assigned288 type : list of atom types, optional289 type of N atoms, if not specied, all atoms are assigned as type 1290 x: list of positions291 list of the type `[posx, posy, posz]` for N atoms292 v: list of velocities293 list of the type `[vx, vy, vz]` for N atoms294 image: list of ints, optional295 if not specified a list of 0s will be used.296 shrinkexceed: bool, optional297 default False298 Returns299 -------300 None301 """302 if x is not None:303 natoms = len(x)304 if type is None:305 type = [1] * natoms306 if ids is None:307 ids = list(range(1, natoms + 1))308 if image is None:309 image = [0] * natoms310 funct_args = [natoms, ids, type, x, v, image, shrinkexceed]311 self._send(command="create_atoms", data=funct_args)312 _ = self._receive()313 else:314 raise TypeError("Value of x cannot be None")315 @property316 def has_exceptions(self):317 """Return whether the LAMMPS shared library was compiled with C++ exceptions handling enabled"""318 self._send(command="has_exceptions", data=[])319 return self._receive()320 @property321 def has_gzip_support(self):322 self._send(command="has_gzip_support", data=[])323 return self._receive()324 @property325 def has_png_support(self):326 self._send(command="has_png_support", data=[])327 return self._receive()328 @property329 def has_jpeg_support(self):330 self._send(command="has_jpeg_support", data=[])331 return self._receive()332 @property333 def has_ffmpeg_support(self):334 self._send(command="has_ffmpeg_support", data=[])335 return self._receive()336 @property337 def installed_packages(self):338 self._send(command="get_installed_packages", data=[])339 return self._receive()340 def set_fix_external_callback(self, *args):341 self._send(command="set_fix_external_callback", data=list(args))342 def get_neighlist(self, *args):343 """Returns an instance of :class:`NeighList` which wraps access to the neighbor list with the given index344 :param idx: index of neighbor list345 :type idx: int346 :return: an instance of :class:`NeighList` wrapping access to neighbor list data347 :rtype: NeighList348 """349 self._send(command="get_neighlist", data=list(args))350 return self._receive()351 def find_pair_neighlist(self, *args):352 """Find neighbor list index of pair style neighbor list353 Try finding pair instance that matches style. If exact is set, the pair must354 match style exactly. If exact is 0, style must only be contained. If pair is355 of style pair/hybrid, style is instead matched the nsub-th hybrid sub-style.356 Once the pair instance has been identified, multiple neighbor list requests357 may be found. Every neighbor list is uniquely identified by its request358 index. Thus, providing this request index ensures that the correct neighbor359 list index is returned.360 :param style: name of pair style that should be searched for361 :type style: string362 :param exact: controls whether style should match exactly or only must be contained in pair style name, defaults to True363 :type exact: bool, optional364 :param nsub: match nsub-th hybrid sub-style, defaults to 0365 :type nsub: int, optional366 :param request: index of neighbor list request, in case there are more than one, defaults to 0367 :type request: int, optional368 :return: neighbor list index if found, otherwise -1369 :rtype: int370 """371 self._send(command="find_pair_neighlist", data=list(args))372 return self._receive()373 def find_fix_neighlist(self, *args):374 """Find neighbor list index of fix neighbor list375 :param fixid: name of fix376 :type fixid: string377 :param request: index of neighbor list request, in case there are more than one, defaults to 0378 :type request: int, optional379 :return: neighbor list index if found, otherwise -1380 :rtype: int381 """382 self._send(command="find_fix_neighlist", data=list(args))383 return self._receive()384 def find_compute_neighlist(self, *args):385 """Find neighbor list index of compute neighbor list386 :param computeid: name of compute387 :type computeid: string388 :param request: index of neighbor list request, in case there are more than one, defaults to 0389 :type request: int, optional390 :return: neighbor list index if found, otherwise -1391 :rtype: int392 """393 self._send(command="find_compute_neighlist", data=list(args))394 return self._receive()395 def get_neighlist_size(self, *args):396 """Return the number of elements in neighbor list with the given index397 :param idx: neighbor list index398 :type idx: int399 :return: number of elements in neighbor list with index idx400 :rtype: int401 """402 self._send(command="get_neighlist_size", data=list(args))403 return self._receive()404 def get_neighlist_element_neighbors(self, *args):405 self._send(command="get_neighlist_element_neighbors", data=list(args))406 return self._receive()407 def command(self, cmd):408 """409 Send a command to the lammps object410 Parameters411 ----------412 cmd : string, list of strings413 command to be sent414 Returns415 -------416 None417 """418 if isinstance(cmd, list):419 for c in cmd:420 self._send(command="command", data=c)421 _ = self._receive()422 elif len(cmd.split("\n")) > 1:423 for c in cmd.split("\n"):424 self._send(command="command", data=c)425 _ = self._receive()426 else:427 self._send(command="command", data=cmd)428 _ = self._receive()429 def gather_atoms(self, *args, concat=False, ids=None):430 """431 Gather atom properties432 Parameters433 ----------434 name : {'x', 'mass', 'id', 'type', 'mask', 'v', 'f',435 'molecule', 'q', 'mu', 'omega', 'angmom', 'torque', 'radius'}436 the property of atom to be extracted437 concat : bool, optional. Default False438 If True, gather information from all processors,439 but not sorted according to Atom ids440 ids : list, optional. Default None441 If a list of ids are provided, the required information442 for only those atoms are returned443 Returns444 -------445 val : array of length n_atoms sorted by atom ids446 If the requested name has multiple dimensions, output447 will be a multi-dimensional array.448 Notes449 -----450 This method gathers information from all processors.451 See Also452 --------453 extract_atoms454 """455 if concat:456 self._send(command="gather_atoms_concat", data=list(args))457 elif ids is not None:458 lenids = len(ids)459 args = list(args)460 args.append(len(ids))461 args.append(ids)462 self._send(command="gather_atoms_subset", data=args)463 else:464 self._send(command="gather_atoms", data=list(args))465 return self._receive()466 def scatter_atoms(self, *args, ids=None):467 """468 Scatter atoms for the lammps library469 Args:470 *args:471 """472 if ids is not None:473 lenids = len(ids)474 args = list(args)475 args.append(len(ids))476 args.append(ids)477 self._send(command="scatter_atoms_subset", data=args)478 _ = self._receive()479 else:480 self._send(command="scatter_atoms", data=list(args))481 _ = self._receive()482 def get_thermo(self, *args):483 """484 Return current value of thermo keyword485 Parameters486 ----------487 name : string488 name of the thermo keyword489 Returns490 -------491 val492 value of the thermo keyword493 """494 self._send(command="get_thermo", data=list(args))495 return self._receive()496 # TODO497 def extract_compute(self, id, style, type, length=0, width=0):498 """499 Extract compute value from the lammps library500 Parameters501 ----------502 id : string503 id of the compute504 style: {0, 1}505 0 - global data506 1 - per atom data507 type: {0, 1, 2}508 0 - scalar509 1 - vector510 2 - array511 length: int, optional. Default 0512 if `style` is 0 and `type` is 1 or 2, then `length` is the length513 of vector.514 width: int, optional. Default 0515 if `type` is 2, then `width` is the number of elements in each516 element along length.517 Returns518 -------519 val520 data computed by the fix depending on the chosen inputs521 """522 args = [id, style, type, length, width]523 self._send(command="extract_compute", data=args)524 return self._receive()525 def close(self):526 """527 Close the current lammps object528 Parameters529 ----------530 None531 Returns532 -------533 None534 """535 self._send(command="close")536 try:537 self._process.kill()538 except AttributeError:...

Full Screen

Full Screen

test_mpd.py

Source:test_mpd.py Github

copy

Full Screen

...13 _send('OK MPD 1.2.3\n')14def _send(*x):15 'what shoud send to the client'16 _rwfile.readline.side_effect = x17def _receive(*a, **k):18 'what MPD should recieve from the client'19 _rwfile.write.assert_called_with(*a, **k)20def patch_record(m):21 global _send, _receive, _data22 _send = _receive = noop23 _data = []24 c = m._mpd25 r = c._rfile.readline26 def readline():27 line = r()28 _data.append('< ' + line)29 return line30 c._rfile.readline = readline31 w = c._wfile.write32 def write(x):33 _data.append('> ' + x)34 w(x)35 c._wfile.write = write36@pytest.fixture()37def mpd():38 try:39 m = MPD()40 m.connect('localhost', 6600)41 patch_record(m)42 yield m43 m.disconnect()44 except: # if connection to a real MPD fails, use mocked protocol replies45 m = MPD()46 patch_mock(m)47 m.connect('localhost', 6600)48 yield m49 finally:50 print(_rwfile.mock_calls)51 for x in _data:52 print(repr(x))53OK = 'OK\n'54def test_mpd_connect(mpd):55 assert mpd.timeout < 1056 assert mpd.idletimeout is None57 _send(OK)58 mpd.status()59 mpd._mpd.disconnect()60 _send('OK MPD foo\n', OK)61 mpd.status() # fails if it did not reconnect automatically62 _rwfile.write.side_effect = [ConnectionError] + [None] * 1063 _send('OK MPD foo\n', OK)64 mpd.status() # fails if it did not reconnect automatically65 _send(ConnectionError, 'OK MPD foo\n', OK)66 mpd.status() # fails if it did not reconnect automatically67@pytest.mark.xfail(strict=1)68def test_mpd_disconnect(mpd):69 mpd.disconnect()70 mpd.status() # must fail, because it's disconnected71def test_volume(mpd):72 _send('volume: 10\n', OK)73 v = mpd.volume()74 assert 0 <= v <= 10075 _receive('status\n')76 _send(OK)77 mpd.volume(42)78 _receive('setvol "42"\n')79 _send('volume: 42\n', OK)80 assert mpd.volume() == 4281 _receive('status\n')82 _send('volume: 42\n', OK, OK)83 mpd.volume('+3')84 _receive('setvol "45"\n')85 _send('volume: 45\n', OK)86 assert mpd.volume() == 42 + 387 _receive('status\n')88 _send('volume: 45\n', OK, OK)89 mpd.volume('-7')90 _receive('setvol "38"\n')91 _send('volume: 38\n', OK)92 assert mpd.volume() == 42 + 3 - 793 _receive('status\n')94def test_toggle_play(mpd):95 _send(OK)96 mpd.clear()97 _receive('clear\n')98 _send(OK)99 mpd.add('http://89.16.185.174:8003/stream')100 _receive('add "http://89.16.185.174:8003/stream"\n')101 _send('state: stop\n', OK)102 assert mpd.state() == 'stop'103 _receive('status\n')104 _send('state: stop\n', OK, OK)105 mpd.toggle_play()106 _receive('play\n')107 _send('state: play\n', OK)108 assert mpd.state() == 'play'109 _receive('status\n')110 _send('state: play\n', OK, OK)111 mpd.toggle_play()112 _receive('pause\n')113 _send('state: pause\n', OK)114 assert mpd.state() == 'pause'115 _receive('status\n')116 _send('state: pause\n', OK, OK)117 mpd.toggle_play()118 _receive('pause\n')119 _send('state: play\n', OK)120 assert mpd.state() == 'play'121 _receive('status\n')122 _send(OK)123 mpd.stop()124 _receive('stop\n')125 _send('state: stop\n', OK)126 assert mpd.state() == 'stop'127 _receive('status\n')128def test_save_playlist(mpd):129 pl = '#foo#'130 _send('ACK [50@0] {rm} No such playlist\n', OK)131 mpd.save_playlist(pl)132 _receive('save "' + pl + '"\n')133 _send(OK, OK)134 mpd.save_playlist(pl)135 _receive('save "' + pl + '"\n')136 _send('playlist: #foo#\n', OK)137 assert mpd.has_playlist(pl)138 _receive('listplaylists\n')139 _send(OK)140 mpd.del_playlist(pl)141 _receive('rm "' + pl + '"\n')142 _send(OK)143 assert not mpd.has_playlist(pl)144 _receive('listplaylists\n')145def test_load_playlist(mpd):146 pl = '#bar#'147 _send(OK)148 mpd.clear()149 _receive('clear\n')150 _send(OK)151 mpd.add('http://foo')152 _receive('add "http://foo"\n')153 _send(OK)154 mpd.add('http://bar')155 _receive('add "http://bar"\n')156 _send(OK, OK)157 mpd.save_playlist(pl)158 _receive('save "' + pl + '"\n')159 _send(OK)160 mpd.clear()161 _receive('clear\n')162 _send(OK)163 assert not mpd.playlist()164 _receive('playlist\n')165 _send('playlist: #bar#\n', OK, OK, OK)166 mpd.load_playlist(pl)167 _receive('load "' + pl + '"\n')168 _send('0:file: http://foo\n', '1:file: http://bar\n', OK)169 p = mpd.playlist()170 assert len(p) == 2171 _receive('playlist\n')172 _send(OK)173 mpd.del_playlist(pl)174 _receive('rm "' + pl + '"\n')175def test_playlist(mpd):176 _send(OK)177 mpd.clear()178 _receive('clear\n')179 pl = mpd.current_playlist()180 _send('playlistlength: 0\n', OK)181 assert len(pl) == 0182 _receive('status\n')183 urls = ['http://89.16.185.174:8003/stream',184 'http://89.16.185.174:8000/stream',185 'http://89.16.185.174:8004/stream']186 for u in urls:187 _send(OK)188 mpd.add(u)189 _receive('add "' + u + '"\n')190 _send('playlistlength: 3\n', OK)191 assert len(pl) == 3192 _receive('status\n')193 _send('playlistlength: 3\n', OK)194 pl_iter = iter(pl)195 _receive('status\n')196 # with title197 _send('file: ' + urls[0] + '\n', 'Pos: 0\n', 'Title: foo\n', OK)198 song = next(pl_iter)199 _receive('playlistinfo "0"\n')200 assert song['file'] == urls[0]201 assert song['pos'] == '0'202 assert 'title' in song203 # without title204 _send('file: ' + urls[1] + '\n', 'Pos: 1\n', OK, 'state: stop\n', OK, OK,205 'file: ' + urls[1] + '\n', 'Pos: 1\n', 'Title: bar\n', OK, OK)206 song = next(pl_iter)207 _receive('stop\n')208 assert song['file'] == urls[1]209 assert song['pos'] == '1'210 assert 'title' in song211 # title on second try212 _send('file: ' + urls[2] + '\n', 'Pos: 2\n', OK, 'state: play\n', 'song: 1\n', OK, OK,213 'file: ' + urls[2] + '\n', 'Pos: 2\n', OK,214 'file: ' + urls[2] + '\n', 'Pos: 2\n', 'Title: lorem ipsum\n', OK, OK)215 song = next(pl_iter)216 _receive('play "1"\n')217 assert song['file'] == urls[2]218 assert song['pos'] == '2'219 assert 'title' in song220 _send('state: stop\n', OK)221 assert mpd.state() == 'stop'222 _receive('status\n')223def test_playlist_find_next_single_album(mpd):224 _send(OK)225 mpd.clear()226 _receive('clear\n')227 pl = mpd.current_playlist()228 _send('playlistlength: 0\n', OK)229 assert len(pl) == 0230 _receive('status\n')231 urls = ['http://89.16.185.174:8003/stream',232 'http://89.16.185.174:8000/stream',233 'http://89.16.185.174:8004/stream']234 _send(OK, OK, OK)235 for u in urls:236 mpd.add(u)237 _send('state: stop\n', OK,238 'playlistlength: 3\n', OK,239 'Pos: 0\n', 'Album: foo\n', OK,240 'Pos: 1\n', 'Album: foo\n', OK,241 'Pos: 2\n', 'Album: foo\n', OK,242 )243 next = mpd.find_next('album')244 assert next is None245def test_playlist_find_next_two_albums(mpd):246 _send(OK)247 mpd.clear()248 _receive('clear\n')249 pl = mpd.current_playlist()250 _send('playlistlength: 0\n', OK)251 assert len(pl) == 0252 _receive('status\n')253 urls = ['http://89.16.185.174:8003/stream',254 'http://89.16.185.174:8000/stream',255 'http://89.16.185.174:8004/stream']256 _send(OK, OK, OK)257 for u in urls:258 mpd.add(u)259 _send('state: play\n', 'song: 1\n', OK,260 'playlistlength: 3\n', OK,261 'Pos: 1\n', 'Album: foo\n', OK,262 'Pos: 2\n', 'Album: bar\n', OK,263 )264 next = mpd.find_next('album')265 assert next == 2266def test_playlist_find_prev_single_album(mpd):267 _send(OK)268 mpd.clear()269 _receive('clear\n')270 pl = mpd.current_playlist()271 _send('playlistlength: 0\n', OK)272 assert len(pl) == 0273 _receive('status\n')274 urls = ['http://89.16.185.174:8003/stream',275 'http://89.16.185.174:8000/stream',276 'http://89.16.185.174:8004/stream']277 _send(OK, OK, OK)278 for u in urls:279 mpd.add(u)280 _send('state: stop\n', OK,281 'playlistlength: 3\n', OK,282 'Pos: 0\n', 'Album: foo\n', OK,283 'Pos: 1\n', 'Album: foo\n', OK,284 'Pos: 2\n', 'Album: foo\n', OK,285 )286 prev = mpd.find_prev('album')287 assert prev is None288def test_playlist_find_prev_two_albums(mpd):289 _send(OK)290 mpd.clear()291 _receive('clear\n')292 pl = mpd.current_playlist()293 _send('playlistlength: 0\n', OK)294 assert len(pl) == 0295 _receive('status\n')296 urls = ['http://89.16.185.174:8003/stream',297 'http://89.16.185.174:8000/stream',298 'http://89.16.185.174:8004/stream']299 _send(OK, OK, OK)300 for u in urls:301 mpd.add(u)302 _send('state: play\n', 'song: 2\n', OK,303 'playlistlength: 3\n', OK,304 'Pos: 2\n', 'Album: bar\n', OK,305 'Pos: 1\n', 'Album: foo\n', OK,306 'Pos: 0\n', 'Album: foo\n', OK,307 )308 prev = mpd.find_prev('album')309 assert prev == 0310def test_playlist_find_prev_three_albums(mpd):311 _send(OK)312 mpd.clear()313 _receive('clear\n')314 pl = mpd.current_playlist()315 _send('playlistlength: 0\n', OK)316 assert len(pl) == 0317 _receive('status\n')318 urls = ['http://89.16.185.174:8003/stream',319 'http://89.16.185.174:8000/stream',320 'http://89.16.185.174:8004/stream']321 _send(OK, OK, OK)322 for u in urls:323 mpd.add(u)324 _send(OK, OK, OK)325 for u in urls:326 mpd.add(u)327 _send('state: play\n', 'song: 4\n', OK,328 'playlistlength: 3\n', OK,329 'Pos: 4\n', 'Album: bar\n', OK,330 'Pos: 3\n', 'Album: bar\n', OK,331 'Pos: 2\n', 'Album: foo\n', OK,...

Full Screen

Full Screen

signals.py

Source:signals.py Github

copy

Full Screen

1from django.db.models.signals import post_save, pre_delete2from django.contrib.auth.models import User3from django.dispatch import receiver4from .models import Profile,Relationship5@receiver(post_save, sender=User)6def post_save_create_profile(sender, instance, created, **kwargs):7 if created:8 Profile.objects.create(user=instance)9@receiver(post_save,sender=Relationship)10def profile_relationship_friends(sender,instance,created,**kwargs):11 _send=instance.sender12 _receive=instance.receiver13 if instance.status=="accepted":14 _send.friends.add(_receive.user)15 _receive.friends.add(_send.user)16 _send.save()17 _receive.save()18 19@receiver(pre_delete,sender=Relationship)20def remove_from_friends(sender,instance,**kwargs):21 _send=instance.sender22 _receive=instance.receiver23 _send.friends.remove(_receive.user)24 _receive.friends.remove(_send.user)25 _send.save()...

Full Screen

Full Screen

Automation Testing Tutorials

Learn to execute automation testing from scratch with LambdaTest Learning Hub. Right from setting up the prerequisites to run your first automation test, to following best practices and diving deeper into advanced test scenarios. LambdaTest Learning Hubs compile a list of step-by-step guides to help you be proficient with different test automation frameworks i.e. Selenium, Cypress, TestNG etc.

LambdaTest Learning Hubs:

YouTube

You could also refer to video tutorials over LambdaTest YouTube channel to get step by step demonstration from industry experts.

Run autotest automation tests on LambdaTest cloud grid

Perform automation testing on 3000+ real desktop and mobile devices online.

Try LambdaTest Now !!

Get 100 minutes of automation test minutes FREE!!

Next-Gen App & Browser Testing Cloud

Was this article helpful?

Helpful

NotHelpful