Skip to content

Error: AttrW has no attribute get #26

Description

@gkalua
AttributeError: 'AttrW' object has no attribute 'get'
In [1]: [2026-07-24 10:59:18.994+0000 E] Put failed                                                                       [fastcs.attributes.attr_w] attribute=AttrRW(path=1.table, datatype=Table, io_ref=TableFieldIORef(update_period=None, panda_name=SEQ1.TABLE, field_info=TableFieldInfo(type='table', subtype=None, description='Sequencer table of lines', max_length=1048576, fields={'REPEATS': TableFieldDetails(subtype='uint', bit_low=0, bit_high=15, description='Number of times the line will repeat ', labels=None), 'TRIGGER': TableFieldDetails(subtype='enum', bit_low=16, bit_high=19, description='The trigger condition to start the phases ', labels=['Immediate', 'BITA=0', 'BITA=1', 'BITB=0', 'BITB=1', 'BITC=0', 'BITC=1', 'POSA>=POSITION', 'POSA<=POSITION', 'POSB>=POSITION', 'POSB<=POSITION', 'POSC>=POSITION', 'POSC<=POSITION']), 'POSITION': TableFieldDetails(subtype='int', bit_low=32, bit_high=63, description='The position that can be used in trigger condition ', labels=None), 'TIME1': TableFieldDetails(subtype='uint', bit_low=64, bit_high=95, description='The time the optional phase 1 should take ', labels=None), 'OUTA1': TableFieldDetails(subtype='uint', bit_low=20, bit_high=20, description='Output A value during phase 1 ', labels=None), 'OUTB1': TableFieldDetails(subtype='uint', bit_low=21, bit_high=21, description='Output B value during phase 1 ', labels=None), 'OUTC1': TableFieldDetails(subtype='uint', bit_low=22, bit_high=22, description='Output C value during phase 1 ', labels=None), 'OUTD1': TableFieldDetails(subtype='uint', bit_low=23, bit_high=23, description='Output D value during phase 1 ', labels=None), 'OUTE1': TableFieldDetails(subtype='uint', bit_low=24, bit_high=24, description='Output E value during phase 1 ', labels=None), 'OUTF1': TableFieldDetails(subtype='uint', bit_low=25, bit_high=25, description='Output F value during phase 1 ', labels=None), 'TIME2': TableFieldDetails(subtype='uint', bit_low=96, bit_high=127, description='The time the mandatory phase 2 should take ', labels=None), 'OUTA2': TableFieldDetails(subtype='uint', bit_low=26, bit_high=26, description='Output A value during phase 2 ', labels=None), 'OUTB2': TableFieldDetails(subtype='uint', bit_low=27, bit_high=27, description='Output B value during phase 2 ', labels=None), 'OUTC2': TableFieldDetails(subtype='uint', bit_low=28, bit_high=28, description='Output C value during phase 2 ', labels=None), 'OUTD2': TableFieldDetails(subtype='uint', bit_low=29, bit_high=29, description='Output D value during phase 2 ', labels=None), 'OUTE2': TableFieldDetails(subtype='uint', bit_low=30, bit_high=30, description='Output E value during phase 2 ', labels=None), 'OUTF2': TableFieldDetails(subtype='uint', bit_low=31, bit_high=31, description='Output F value during phase 2 ', labels=None)}, row_words=4, has_mode=True), put_value_to_panda=<bound method RawPanda.put_value_to_panda of <fastcs_pandablocks.panda.client_wrapper.RawPanda object at 0x7fc3d8b94110>>, append_to_panda=<bound method RawPanda.append_to_panda of <fastcs_pandablocks.panda.client_wrapper.RawPanda object at 0x7fc3d8b94110>>, next_write_attr=AttrW(path=1.table_next_write, datatype=Enum, io_ref=None))), setpoint=[(   1, 'BITA=0', 0,      0, 0, 0, 0, 0, 0, 0,     0, 0, 0, 0, 0, 0, 0)
 (   1, 'BITA=1', 0,      0, 0, 0, 0, 0, 0, 0,     0, 0, 0, 0, 0, 0, 0)
 (1000, 'Immediate', 0, 990000, 1, 0, 0, 0, 0, 0, 10000, 0, 0, 0, 0, 0, 0)]
Traceback (most recent call last):
  File "/app/.venv/bin/fastcs-pandablocks", line 10, in <module>
    sys.exit(main())
    │   │    └ <function main at 0x7fc3da8caca0>
    │   └ <built-in function exit>
    └ <module 'sys' (built-in)>
  File "/app/.venv/lib/python3.11/site-packages/fastcs_pandablocks/__main__.py", line 11, in main
    launch(PandaController, version=__version__)
    │      │                        └ '0.2.0a5'
    │      └ <class 'fastcs_pandablocks.panda.panda_controller.PandaController'>
    └ <function launch at 0x7fc3da9672e0>
  File "/app/.venv/lib/python3.11/site-packages/fastcs/launch.py", line 56, in launch
    _launch(controller_class, version)()
    │       │                 └ '0.2.0a5'
    │       └ <class 'fastcs_pandablocks.panda.panda_controller.PandaController'>
    └ <function _launch at 0x7fc3d9544fe0>
  File "/app/.venv/lib/python3.11/site-packages/typer/main.py", line 1135, in __call__
    return get_command(self)(*args, **kwargs)
           │           │      │       └ {}
           │           │      └ ()
           │           └ <typer.main.Typer object at 0x7fc3d95d8f90>
           └ <function get_command at 0x7fc3d9568180>
  File "/app/.venv/lib/python3.11/site-packages/click/core.py", line 1485, in __call__
    return self.main(*args, **kwargs)
           │    │     │       └ {}
           │    │     └ ()
           │    └ <function TyperGroup.main at 0x7fc3d9593ba0>
           └ <TyperGroup >
  File "/app/.venv/lib/python3.11/site-packages/typer/core.py", line 795, in main
    return _main(
           └ <function _main at 0x7fc3d9592a20>
  File "/app/.venv/lib/python3.11/site-packages/typer/core.py", line 188, in _main
    rv = self.invoke(ctx)
         │    │      └ <click.core.Context object at 0x7fc3d945b410>
         │    └ <function Group.invoke at 0x7fc3d9bb4c20>
         └ <TyperGroup >
  File "/app/.venv/lib/python3.11/site-packages/click/core.py", line 1873, in invoke
    return _process_result(sub_ctx.command.invoke(sub_ctx))
           │               │       │       │      └ <click.core.Context object at 0x7fc3d9487250>
           │               │       │       └ <function Command.invoke at 0x7fc3d9b939c0>
           │               │       └ <TyperCommand run>
           │               └ <click.core.Context object at 0x7fc3d9487250>
           └ <function Group.invoke.<locals>._process_result at 0x7fc3d8b46840>
  File "/app/.venv/lib/python3.11/site-packages/click/core.py", line 1269, in invoke
    return ctx.invoke(self.callback, **ctx.params)
           │   │      │    │           │   └ {'config': '/epics/ioc/config/controller.yaml', 'log_level': 'INFO', 'graylog_endpoint': None, 'graylog_static_fields': None,...
           │   │      │    │           └ <click.core.Context object at 0x7fc3d9487250>
           │   │      │    └ <function _launch.<locals>.run at 0x7fc3d8b46020>
           │   │      └ <TyperCommand run>
           │   └ <function Context.invoke at 0x7fc3d9b92c00>
           └ <click.core.Context object at 0x7fc3d9487250>
  File "/app/.venv/lib/python3.11/site-packages/click/core.py", line 824, in invoke
    return callback(*args, **kwargs)
           │         │       └ {'config': '/epics/ioc/config/controller.yaml', 'log_level': 'INFO', 'graylog_endpoint': None, 'graylog_static_fields': None,...
           │         └ ()
           └ <function _launch.<locals>.run at 0x7fc3d8b46020>
  File "/app/.venv/lib/python3.11/site-packages/typer/main.py", line 1514, in wrapper
    return callback(**use_params)
           │          └ {'ctx': <click.core.Context object at 0x7fc3d9487250>, 'config': PosixPath('/epics/ioc/config/controller.yaml'), 'log_level':...
           └ <function _launch.<locals>.run at 0x7fc3d8b45da0>
  File "/app/.venv/lib/python3.11/site-packages/fastcs/launch.py", line 165, in run
    instance.run()
    │        └ <function FastCS.run at 0x7fc3da9671a0>
    └ <fastcs.control_system.FastCS object at 0x7fc3d8b95650>
  File "/app/.venv/lib/python3.11/site-packages/fastcs/control_system.py", line 51, in run
    self._loop.run_until_complete(serve)
    │    │     │                  └ <Task pending name='Task-1' coro=<FastCS.serve() running at /app/.venv/lib/python3.11/site-packages/fastcs/control_system.py:...
    │    │     └ <function BaseEventLoop.run_until_complete at 0x7fc4069d37e0>
    │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
    └ <fastcs.control_system.FastCS object at 0x7fc3d8b95650>
  File "/python/cpython-3.11.15-linux-x86_64-gnu/lib/python3.11/asyncio/base_events.py", line 641, in run_until_complete
    self.run_forever()
    │    └ <function BaseEventLoop.run_forever at 0x7fc4069d3740>
    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
  File "/python/cpython-3.11.15-linux-x86_64-gnu/lib/python3.11/asyncio/base_events.py", line 608, in run_forever
    self._run_once()
    │    └ <function BaseEventLoop._run_once at 0x7fc4069e9580>
    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
  File "/python/cpython-3.11.15-linux-x86_64-gnu/lib/python3.11/asyncio/base_events.py", line 1936, in _run_once
    handle._run()
    │      └ <function Handle._run at 0x7fc406b07100>
    └ <Handle <TaskStepMethWrapper object at 0x7fc3ca314fa0>()>
  File "/python/cpython-3.11.15-linux-x86_64-gnu/lib/python3.11/asyncio/events.py", line 84, in _run
    self._context.run(self._callback, *self._args)
    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
    │    │            │    │           └ <Handle <TaskStepMethWrapper object at 0x7fc3ca314fa0>()>
    │    │            │    └ <member '_callback' of 'Handle' objects>
    │    │            └ <Handle <TaskStepMethWrapper object at 0x7fc3ca314fa0>()>
    │    └ <member '_context' of 'Handle' objects>
    └ <Handle <TaskStepMethWrapper object at 0x7fc3ca314fa0>()>
  File "/app/.venv/lib/python3.11/site-packages/fastcs/transports/epics/pva/_pv_handlers.py", line 50, in put
    await self._attr_w.put(cast_value)
          │    │       │   └ array([(   1, 'BITA=0', 0,      0, 0, 0, 0, 0, 0, 0,     0, 0, 0, 0, 0, 0, 0),
          │    │       │            (   1, 'BITA=1', 0,      0, 0, 0, 0, 0,...
          │    │       └ <function AttrW.put at 0x7fc3dc6c2020>
          │    └ AttrRW(path=1.table, datatype=Table, io_ref=TableFieldIORef(update_period=None, panda_name=SEQ1.TABLE, field_info=TableFieldI...
          └ <fastcs.transports.epics.pva._pv_handlers.WritePvHandler object at 0x7fc3cb73d3d0>
> File "/app/.venv/lib/python3.11/site-packages/fastcs/attributes/attr_w.py", line 57, in put
    await self._on_put_callback(self, setpoint)
          │    │                │     └ array([(   1, 'BITA=0', 0,      0, 0, 0, 0, 0, 0, 0,     0, 0, 0, 0, 0, 0, 0),
          │    │                │              (   1, 'BITA=1', 0,      0, 0, 0, 0, 0,...
          │    │                └ AttrRW(path=1.table, datatype=Table, io_ref=TableFieldIORef(update_period=None, panda_name=SEQ1.TABLE, field_info=TableFieldI...
          │    └ <bound method TableFieldIO.send of <fastcs_pandablocks.panda.io.table.TableFieldIO object at 0x7fc3d8b94c90>>
          └ AttrRW(path=1.table, datatype=Table, io_ref=TableFieldIORef(update_period=None, panda_name=SEQ1.TABLE, field_info=TableFieldI...
  File "/app/.venv/lib/python3.11/site-packages/fastcs_pandablocks/panda/io/table.py", line 60, in send
    attr.io_ref.next_write_attr.get()
    │    └ <property object at 0x7fc40531d300>
    └ AttrRW(path=1.table, datatype=Table, io_ref=TableFieldIORef(update_period=None, panda_name=SEQ1.TABLE, field_info=TableFieldI...
AttributeError: 'AttrW' object has no attribute 'get'
In [1]: [2026-07-24 10:59:19.178+0000 E] Put failed                                                                       [fastcs.attributes.attr_w] attribute=AttrRW(path=1.table, datatype=Table, io_ref=TableFieldIORef(update_period=None, panda_name=SEQ1.TABLE, field_info=TableFieldInfo(type='table', subtype=None, description='Sequencer table of lines', max_length=1048576, fields={'REPEATS': TableFieldDetails(subtype='uint', bit_low=0, bit_high=15, description='Number of times the line will repeat ', labels=None), 'TRIGGER': TableFieldDetails(subtype='enum', bit_low=16, bit_high=19, description='The trigger condition to start the phases ', labels=['Immediate', 'BITA=0', 'BITA=1', 'BITB=0', 'BITB=1', 'BITC=0', 'BITC=1', 'POSA>=POSITION', 'POSA<=POSITION', 'POSB>=POSITION', 'POSB<=POSITION', 'POSC>=POSITION', 'POSC<=POSITION']), 'POSITION': TableFieldDetails(subtype='int', bit_low=32, bit_high=63, description='The position that can be used in trigger condition ', labels=None), 'TIME1': TableFieldDetails(subtype='uint', bit_low=64, bit_high=95, description='The time the optional phase 1 should take ', labels=None), 'OUTA1': TableFieldDetails(subtype='uint', bit_low=20, bit_high=20, description='Output A value during phase 1 ', labels=None), 'OUTB1': TableFieldDetails(subtype='uint', bit_low=21, bit_high=21, description='Output B value during phase 1 ', labels=None), 'OUTC1': TableFieldDetails(subtype='uint', bit_low=22, bit_high=22, description='Output C value during phase 1 ', labels=None), 'OUTD1': TableFieldDetails(subtype='uint', bit_low=23, bit_high=23, description='Output D value during phase 1 ', labels=None), 'OUTE1': TableFieldDetails(subtype='uint', bit_low=24, bit_high=24, description='Output E value during phase 1 ', labels=None), 'OUTF1': TableFieldDetails(subtype='uint', bit_low=25, bit_high=25, description='Output F value during phase 1 ', labels=None), 'TIME2': TableFieldDetails(subtype='uint', bit_low=96, bit_high=127, description='The time the mandatory phase 2 should take ', labels=None), 'OUTA2': TableFieldDetails(subtype='uint', bit_low=26, bit_high=26, description='Output A value during phase 2 ', labels=None), 'OUTB2': TableFieldDetails(subtype='uint', bit_low=27, bit_high=27, description='Output B value during phase 2 ', labels=None), 'OUTC2': TableFieldDetails(subtype='uint', bit_low=28, bit_high=28, description='Output C value during phase 2 ', labels=None), 'OUTD2': TableFieldDetails(subtype='uint', bit_low=29, bit_high=29, description='Output D value during phase 2 ', labels=None), 'OUTE2': TableFieldDetails(subtype='uint', bit_low=30, bit_high=30, description='Output E value during phase 2 ', labels=None), 'OUTF2': TableFieldDetails(subtype='uint', bit_low=31, bit_high=31, description='Output F value during phase 2 ', labels=None)}, row_words=4, has_mode=True), put_value_to_panda=<bound method RawPanda.put_value_to_panda of <fastcs_pandablocks.panda.client_wrapper.RawPanda object at 0x7fc3d8b94110>>, append_to_panda=<bound method RawPanda.append_to_panda of <fastcs_pandablocks.panda.client_wrapper.RawPanda object at 0x7fc3d8b94110>>, next_write_attr=AttrW(path=1.table_next_write, datatype=Enum, io_ref=None))), setpoint=[]
Traceback (most recent call last):
  File "/app/.venv/bin/fastcs-pandablocks", line 10, in <module>
    sys.exit(main())
    │   │    └ <function main at 0x7fc3da8caca0>
    │   └ <built-in function exit>
    └ <module 'sys' (built-in)>
  File "/app/.venv/lib/python3.11/site-packages/fastcs_pandablocks/__main__.py", line 11, in main
    launch(PandaController, version=__version__)
    │      │                        └ '0.2.0a5'
    │      └ <class 'fastcs_pandablocks.panda.panda_controller.PandaController'>
    └ <function launch at 0x7fc3da9672e0>
  File "/app/.venv/lib/python3.11/site-packages/fastcs/launch.py", line 56, in launch
    _launch(controller_class, version)()
    │       │                 └ '0.2.0a5'
    │       └ <class 'fastcs_pandablocks.panda.panda_controller.PandaController'>
    └ <function _launch at 0x7fc3d9544fe0>
  File "/app/.venv/lib/python3.11/site-packages/typer/main.py", line 1135, in __call__
    return get_command(self)(*args, **kwargs)
           │           │      │       └ {}
           │           │      └ ()
           │           └ <typer.main.Typer object at 0x7fc3d95d8f90>
           └ <function get_command at 0x7fc3d9568180>
  File "/app/.venv/lib/python3.11/site-packages/click/core.py", line 1485, in __call__
    return self.main(*args, **kwargs)
           │    │     │       └ {}
           │    │     └ ()
           │    └ <function TyperGroup.main at 0x7fc3d9593ba0>
           └ <TyperGroup >
  File "/app/.venv/lib/python3.11/site-packages/typer/core.py", line 795, in main
    return _main(
           └ <function _main at 0x7fc3d9592a20>
  File "/app/.venv/lib/python3.11/site-packages/typer/core.py", line 188, in _main
    rv = self.invoke(ctx)
         │    │      └ <click.core.Context object at 0x7fc3d945b410>
         │    └ <function Group.invoke at 0x7fc3d9bb4c20>
         └ <TyperGroup >
  File "/app/.venv/lib/python3.11/site-packages/click/core.py", line 1873, in invoke
    return _process_result(sub_ctx.command.invoke(sub_ctx))
           │               │       │       │      └ <click.core.Context object at 0x7fc3d9487250>
           │               │       │       └ <function Command.invoke at 0x7fc3d9b939c0>
           │               │       └ <TyperCommand run>
           │               └ <click.core.Context object at 0x7fc3d9487250>
           └ <function Group.invoke.<locals>._process_result at 0x7fc3d8b46840>
  File "/app/.venv/lib/python3.11/site-packages/click/core.py", line 1269, in invoke
    return ctx.invoke(self.callback, **ctx.params)
           │   │      │    │           │   └ {'config': '/epics/ioc/config/controller.yaml', 'log_level': 'INFO', 'graylog_endpoint': None, 'graylog_static_fields': None,...
           │   │      │    │           └ <click.core.Context object at 0x7fc3d9487250>
           │   │      │    └ <function _launch.<locals>.run at 0x7fc3d8b46020>
           │   │      └ <TyperCommand run>
           │   └ <function Context.invoke at 0x7fc3d9b92c00>
           └ <click.core.Context object at 0x7fc3d9487250>
  File "/app/.venv/lib/python3.11/site-packages/click/core.py", line 824, in invoke
    return callback(*args, **kwargs)
           │         │       └ {'config': '/epics/ioc/config/controller.yaml', 'log_level': 'INFO', 'graylog_endpoint': None, 'graylog_static_fields': None,...
           │         └ ()
           └ <function _launch.<locals>.run at 0x7fc3d8b46020>
  File "/app/.venv/lib/python3.11/site-packages/typer/main.py", line 1514, in wrapper
    return callback(**use_params)
           │          └ {'ctx': <click.core.Context object at 0x7fc3d9487250>, 'config': PosixPath('/epics/ioc/config/controller.yaml'), 'log_level':...
           └ <function _launch.<locals>.run at 0x7fc3d8b45da0>
  File "/app/.venv/lib/python3.11/site-packages/fastcs/launch.py", line 165, in run
    instance.run()
    │        └ <function FastCS.run at 0x7fc3da9671a0>
    └ <fastcs.control_system.FastCS object at 0x7fc3d8b95650>
  File "/app/.venv/lib/python3.11/site-packages/fastcs/control_system.py", line 51, in run
    self._loop.run_until_complete(serve)
    │    │     │                  └ <Task pending name='Task-1' coro=<FastCS.serve() running at /app/.venv/lib/python3.11/site-packages/fastcs/control_system.py:...
    │    │     └ <function BaseEventLoop.run_until_complete at 0x7fc4069d37e0>
    │    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
    └ <fastcs.control_system.FastCS object at 0x7fc3d8b95650>
  File "/python/cpython-3.11.15-linux-x86_64-gnu/lib/python3.11/asyncio/base_events.py", line 641, in run_until_complete
    self.run_forever()
    │    └ <function BaseEventLoop.run_forever at 0x7fc4069d3740>
    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
  File "/python/cpython-3.11.15-linux-x86_64-gnu/lib/python3.11/asyncio/base_events.py", line 608, in run_forever
    self._run_once()
    │    └ <function BaseEventLoop._run_once at 0x7fc4069e9580>
    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
  File "/python/cpython-3.11.15-linux-x86_64-gnu/lib/python3.11/asyncio/base_events.py", line 1936, in _run_once
    handle._run()
    │      └ <function Handle._run at 0x7fc406b07100>
    └ <Handle <TaskStepMethWrapper object at 0x7fc3ca317e80>()>
  File "/python/cpython-3.11.15-linux-x86_64-gnu/lib/python3.11/asyncio/events.py", line 84, in _run
    self._context.run(self._callback, *self._args)
    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
    │    │            │    │           └ <Handle <TaskStepMethWrapper object at 0x7fc3ca317e80>()>
    │    │            │    └ <member '_callback' of 'Handle' objects>
    │    │            └ <Handle <TaskStepMethWrapper object at 0x7fc3ca317e80>()>
    │    └ <member '_context' of 'Handle' objects>
    └ <Handle <TaskStepMethWrapper object at 0x7fc3ca317e80>()>
  File "/app/.venv/lib/python3.11/site-packages/fastcs/transports/epics/pva/_pv_handlers.py", line 50, in put
    await self._attr_w.put(cast_value)
          │    │       │   └ array([],
          │    │       │           dtype=[('repeats', '<u4'), ('trigger', '<U16'), ('position', '<i4'), ('time1', '<u4'), ('outa1', '<u4'), ('ou...
          │    │       └ <function AttrW.put at 0x7fc3dc6c2020>
          │    └ AttrRW(path=1.table, datatype=Table, io_ref=TableFieldIORef(update_period=None, panda_name=SEQ1.TABLE, field_info=TableFieldI...
          └ <fastcs.transports.epics.pva._pv_handlers.WritePvHandler object at 0x7fc3cb73d3d0>
> File "/app/.venv/lib/python3.11/site-packages/fastcs/attributes/attr_w.py", line 57, in put
    await self._on_put_callback(self, setpoint)
          │    │                │     └ array([],
          │    │                │             dtype=[('repeats', '<u4'), ('trigger', '<U16'), ('position', '<i4'), ('time1', '<u4'), ('outa1', '<u4'), ('ou...
          │    │                └ AttrRW(path=1.table, datatype=Table, io_ref=TableFieldIORef(update_period=None, panda_name=SEQ1.TABLE, field_info=TableFieldI...
          │    └ <bound method TableFieldIO.send of <fastcs_pandablocks.panda.io.table.TableFieldIO object at 0x7fc3d8b94c90>>
          └ AttrRW(path=1.table, datatype=Table, io_ref=TableFieldIORef(update_period=None, panda_name=SEQ1.TABLE, field_info=TableFieldI...
  File "/app/.venv/lib/python3.11/site-packages/fastcs_pandablocks/panda/io/table.py", line 60, in send
    attr.io_ref.next_write_attr.get()
    │    └ <property object at 0x7fc40531d300>
    └ AttrRW(path=1.table, datatype=Table, io_ref=TableFieldIORef(update_period=None, panda_name=SEQ1.TABLE, field_info=TableFieldI...
AttributeError: 'AttrW' object has no attribute 'get' 

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions