mirror of
https://github.com/Gnucash/gnucash.git
synced 2025-02-25 18:55:30 -06:00
2002-04-20 Joshua Sled <jsled@asynchronous.org>
* src/gnome/dialog-sxsincelast.c (process_auto_create_list): Added progress-bar support for transaction auto-creation. git-svn-id: svn+ssh://svn.gnucash.org/repo/gnucash/trunk@6816 57a11ea4-9604-0410-9ed3-97b8803252fd
This commit is contained in:
parent
8d1cb07b21
commit
833d4042b4
14
ChangeLog
14
ChangeLog
@ -1,3 +1,17 @@
|
|||||||
|
2002-04-20 Joshua Sled <jsled@asynchronous.org>
|
||||||
|
|
||||||
|
* src/gnome/dialog-sxsincelast.c (process_auto_create_list): Added
|
||||||
|
progress-bar support for transaction auto-creation.
|
||||||
|
|
||||||
|
2002-04-17 Joshua Sled <jsled@asynchronous.org>
|
||||||
|
|
||||||
|
* src/gnome/dialog-scheduledxaction.c
|
||||||
|
(editor_ok_button_clicked): Added checks for ScheduledTransactions
|
||||||
|
with no name, same name as existing SchedXaction.
|
||||||
|
(row_select_handler): Resolved "critical" GTK run-time warning
|
||||||
|
regarding navigating the Scheduled Transaction list with the arrow
|
||||||
|
keys.
|
||||||
|
|
||||||
2002-04-16 Joshua Sled <jsled@asynchronous.org>
|
2002-04-16 Joshua Sled <jsled@asynchronous.org>
|
||||||
|
|
||||||
* src/gnome/dialog-scheduledxaction.c
|
* src/gnome/dialog-scheduledxaction.c
|
||||||
|
@ -128,6 +128,12 @@ X create a template register
|
|||||||
dialogs are open.
|
dialogs are open.
|
||||||
. creating a SX from trans with the SX list open does not update the SX
|
. creating a SX from trans with the SX list open does not update the SX
|
||||||
list
|
list
|
||||||
|
. So since Advanced editing entails "Simple" editing, it should just
|
||||||
|
replace that window. Then, with some CM hookup between the List and
|
||||||
|
the Editor, all is well.
|
||||||
|
. 20020419 - Wilddev manages to create two SXes from one; the first is
|
||||||
|
okay, but the second is h0rk3d [deleting it causes segfault, though it
|
||||||
|
can be instantiated correctly].
|
||||||
. tab-order
|
. tab-order
|
||||||
. better frequency guess?
|
. better frequency guess?
|
||||||
[ related... ]
|
[ related... ]
|
||||||
@ -164,8 +170,10 @@ X create a template register
|
|||||||
. But this is true of manually-created transactions, too ... is this
|
. But this is true of manually-created transactions, too ... is this
|
||||||
actually correct behavior?
|
actually correct behavior?
|
||||||
. inital "To-Create Transactions" varbinding table doesn't setup table correctly.
|
. inital "To-Create Transactions" varbinding table doesn't setup table correctly.
|
||||||
. creating/cancelling a bunch [FIXME:define "bunch"] of transactions
|
. creating a bunch [FIXME:define "bunch"] of transactions takes too long
|
||||||
takes too long, with no progress indication.
|
X with no progress indication.
|
||||||
|
. cancelling a bunch [FIXME:define "bunch"] of xactions takes too long
|
||||||
|
. no progress indication.
|
||||||
X twunder reports [2002.01.29] register growing a little bit at a time if
|
X twunder reports [2002.01.29] register growing a little bit at a time if
|
||||||
tab is hit to switch between register fields -- started with update on
|
tab is hit to switch between register fields -- started with update on
|
||||||
1/21.
|
1/21.
|
||||||
|
@ -77,6 +77,7 @@
|
|||||||
#define SXSLD_DRUID_GLADE_NAME "sincelast_druid"
|
#define SXSLD_DRUID_GLADE_NAME "sincelast_druid"
|
||||||
|
|
||||||
#define SINCELAST_DRUID "sincelast_druid"
|
#define SINCELAST_DRUID "sincelast_druid"
|
||||||
|
#define WHAT_TO_DO_PG "what_to_do"
|
||||||
#define REMINDERS_PG "reminders_page"
|
#define REMINDERS_PG "reminders_page"
|
||||||
#define AUTO_CREATE_NOTIFY_PG "auto_create_notify_page"
|
#define AUTO_CREATE_NOTIFY_PG "auto_create_notify_page"
|
||||||
#define TO_CREATE_PG "to_create_page"
|
#define TO_CREATE_PG "to_create_page"
|
||||||
@ -96,6 +97,8 @@
|
|||||||
#define VARIABLE_TABLE "variables_table"
|
#define VARIABLE_TABLE "variables_table"
|
||||||
#define AUTO_CREATE_VBOX "ac_vbox"
|
#define AUTO_CREATE_VBOX "ac_vbox"
|
||||||
#define CREATED_VBOX "created_vbox"
|
#define CREATED_VBOX "created_vbox"
|
||||||
|
#define WHAT_TO_DO_VBOX "what_to_do_vbox"
|
||||||
|
#define WHAT_TO_DO_PROGRESS "creation_progress"
|
||||||
|
|
||||||
#define TO_CREATE_CLIST_WIDTH 3
|
#define TO_CREATE_CLIST_WIDTH 3
|
||||||
#define REMINDER_CLIST_WIDTH 3
|
#define REMINDER_CLIST_WIDTH 3
|
||||||
@ -133,6 +136,8 @@ typedef struct _sxSinceLastData {
|
|||||||
GnomeDruid *sincelast_druid;
|
GnomeDruid *sincelast_druid;
|
||||||
GladeXML *gxml;
|
GladeXML *gxml;
|
||||||
|
|
||||||
|
GtkProgressBar *prog;
|
||||||
|
|
||||||
/* Multi-stage processing-related stuff... */
|
/* Multi-stage processing-related stuff... */
|
||||||
GList /* <autoCreateTuple*> */ *autoCreateList;
|
GList /* <autoCreateTuple*> */ *autoCreateList;
|
||||||
GList /* <toCreateTuple*> */ *toCreateList;
|
GList /* <toCreateTuple*> */ *toCreateList;
|
||||||
@ -406,13 +411,20 @@ theres_no_turning_back_bang( GnomeDruidPage *druid_page,
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
reminders_page_prep( gpointer ud )
|
whattodo_prep( GnomeDruidPage *druid_page,
|
||||||
|
gpointer arg1, gpointer ud )
|
||||||
|
{
|
||||||
|
DEBUG( "whattodo_prep" );
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
reminders_page_prep( sxSinceLastData *sxsld )
|
||||||
{
|
{
|
||||||
sxSinceLastData *sxsld = (sxSinceLastData*)ud;
|
|
||||||
GtkWidget *w;
|
GtkWidget *w;
|
||||||
if ( g_list_length( sxsld->reminderList ) == 0 ) {
|
if ( g_list_length( sxsld->reminderList ) == 0 ) {
|
||||||
w = glade_xml_get_widget( sxsld->gxml,
|
w = glade_xml_get_widget( sxsld->gxml,
|
||||||
AUTO_CREATE_NOTIFY_PG );
|
AUTO_CREATE_NOTIFY_PG );
|
||||||
|
DEBUG( "Going to auto_create_notify page" );
|
||||||
gnome_druid_set_page( sxsld->sincelast_druid,
|
gnome_druid_set_page( sxsld->sincelast_druid,
|
||||||
GNOME_DRUID_PAGE(w) );
|
GNOME_DRUID_PAGE(w) );
|
||||||
return;
|
return;
|
||||||
@ -429,7 +441,8 @@ static void
|
|||||||
reminders_prep( GnomeDruidPage *druid_page,
|
reminders_prep( GnomeDruidPage *druid_page,
|
||||||
gpointer arg1, gpointer ud )
|
gpointer arg1, gpointer ud )
|
||||||
{
|
{
|
||||||
reminders_page_prep( ud );
|
sxSinceLastData *sxsld = (sxSinceLastData*)ud;
|
||||||
|
reminders_page_prep( sxsld );
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
@ -468,6 +481,7 @@ auto_create_prep( GnomeDruidPage *druid_page,
|
|||||||
sxSinceLastData *sxsld = (sxSinceLastData*)ud;
|
sxSinceLastData *sxsld = (sxSinceLastData*)ud;
|
||||||
|
|
||||||
if ( ! sxsld->autoCreatedSomething ) {
|
if ( ! sxsld->autoCreatedSomething ) {
|
||||||
|
DEBUG( "Going to to_create page" );
|
||||||
w = glade_xml_get_widget( sxsld->gxml, TO_CREATE_PG );
|
w = glade_xml_get_widget( sxsld->gxml, TO_CREATE_PG );
|
||||||
gnome_druid_set_page( sxsld->sincelast_druid,
|
gnome_druid_set_page( sxsld->sincelast_druid,
|
||||||
GNOME_DRUID_PAGE(w) );
|
GNOME_DRUID_PAGE(w) );
|
||||||
@ -483,6 +497,7 @@ created_prep( GnomeDruidPage *druid_page,
|
|||||||
sxSinceLastData *sxsld = (sxSinceLastData*)ud;
|
sxSinceLastData *sxsld = (sxSinceLastData*)ud;
|
||||||
|
|
||||||
if ( !sxsld->createdSomething ) {
|
if ( !sxsld->createdSomething ) {
|
||||||
|
DEBUG( "Going to obsolete page" );
|
||||||
w = glade_xml_get_widget( sxsld->gxml, OBSOLETE_PG );
|
w = glade_xml_get_widget( sxsld->gxml, OBSOLETE_PG );
|
||||||
gnome_druid_set_page( sxsld->sincelast_druid,
|
gnome_druid_set_page( sxsld->sincelast_druid,
|
||||||
GNOME_DRUID_PAGE(w) );
|
GNOME_DRUID_PAGE(w) );
|
||||||
@ -497,6 +512,7 @@ obsolete_prep( GnomeDruidPage *druid_page,
|
|||||||
GtkWidget *w;
|
GtkWidget *w;
|
||||||
sxSinceLastData *sxsld = (sxSinceLastData*)ud;
|
sxSinceLastData *sxsld = (sxSinceLastData*)ud;
|
||||||
if ( g_list_length( sxsld->toRemoveList ) == 0 ) {
|
if ( g_list_length( sxsld->toRemoveList ) == 0 ) {
|
||||||
|
DEBUG( "Going to finish page" );
|
||||||
w = glade_xml_get_widget( sxsld->gxml, FINISH_PG );
|
w = glade_xml_get_widget( sxsld->gxml, FINISH_PG );
|
||||||
gnome_druid_set_page( sxsld->sincelast_druid,
|
gnome_druid_set_page( sxsld->sincelast_druid,
|
||||||
GNOME_DRUID_PAGE(w) );
|
GNOME_DRUID_PAGE(w) );
|
||||||
@ -638,7 +654,8 @@ to_create_next( GnomeDruidPage *druid_page,
|
|||||||
sxsld->createdTxnGUIDList =
|
sxsld->createdTxnGUIDList =
|
||||||
g_list_concat( sxsld->createdTxnGUIDList, created );
|
g_list_concat( sxsld->createdTxnGUIDList, created );
|
||||||
}
|
}
|
||||||
gnc_resume_gui_refresh();
|
|
||||||
|
DEBUG( "Done with creation; updating created ledger." );
|
||||||
|
|
||||||
oldQuery = gnc_ledger_display_get_query( sxsld->created_ledger );
|
oldQuery = gnc_ledger_display_get_query( sxsld->created_ledger );
|
||||||
newQuery = xaccQueryMerge( oldQuery, q, QUERY_AND );
|
newQuery = xaccQueryMerge( oldQuery, q, QUERY_AND );
|
||||||
@ -646,6 +663,8 @@ to_create_next( GnomeDruidPage *druid_page,
|
|||||||
gnc_ledger_display_refresh( sxsld->created_ledger );
|
gnc_ledger_display_refresh( sxsld->created_ledger );
|
||||||
xaccFreeQuery( q );
|
xaccFreeQuery( q );
|
||||||
|
|
||||||
|
gnc_resume_gui_refresh();
|
||||||
|
|
||||||
sxsld->createdSomething = TRUE;
|
sxsld->createdSomething = TRUE;
|
||||||
|
|
||||||
return FALSE;
|
return FALSE;
|
||||||
@ -796,6 +815,10 @@ sxsincelast_init( sxSinceLastData *sxsld )
|
|||||||
};
|
};
|
||||||
|
|
||||||
static druidSignalHandlerTuple pages[] = {
|
static druidSignalHandlerTuple pages[] = {
|
||||||
|
{ WHAT_TO_DO_PG,
|
||||||
|
whattodo_prep, NULL, NULL,
|
||||||
|
NULL, cancel_check },
|
||||||
|
|
||||||
{ REMINDERS_PG,
|
{ REMINDERS_PG,
|
||||||
reminders_prep, theres_no_turning_back_bang, reminders_next,
|
reminders_prep, theres_no_turning_back_bang, reminders_next,
|
||||||
reminders_finish, cancel_check },
|
reminders_finish, cancel_check },
|
||||||
@ -849,14 +872,18 @@ sxsincelast_init( sxSinceLastData *sxsld )
|
|||||||
w = glade_xml_get_widget( sxsld->gxml, SX_OBSOLETE_CLIST );
|
w = glade_xml_get_widget( sxsld->gxml, SX_OBSOLETE_CLIST );
|
||||||
clist_set_all_cols_autoresize(GTK_CLIST(w), SX_OBSOLETE_CLIST_WIDTH);
|
clist_set_all_cols_autoresize(GTK_CLIST(w), SX_OBSOLETE_CLIST_WIDTH);
|
||||||
|
|
||||||
|
sxsld->prog = glade_xml_get_widget( sxsld->gxml, WHAT_TO_DO_PROGRESS );
|
||||||
|
|
||||||
create_autoCreate_ledger( sxsld );
|
create_autoCreate_ledger( sxsld );
|
||||||
create_created_ledger( sxsld );
|
create_created_ledger( sxsld );
|
||||||
|
|
||||||
|
//reminders_page_prep( sxsld );
|
||||||
|
gtk_widget_show_all( sxsld->sincelast_window );
|
||||||
|
|
||||||
process_auto_create_list( sxsld->autoCreateList, sxsld );
|
process_auto_create_list( sxsld->autoCreateList, sxsld );
|
||||||
|
|
||||||
reminders_page_prep( (gpointer)sxsld );
|
w = glade_xml_get_widget( sxsld->gxml, REMINDERS_PG );
|
||||||
|
gnome_druid_set_page( sxsld->sincelast_druid, GNOME_DRUID_PAGE(w) );
|
||||||
gtk_widget_show_all( sxsld->sincelast_window );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -969,9 +996,12 @@ process_auto_create_list( GList *autoCreateList, sxSinceLastData *sxsld )
|
|||||||
autoCreateTuple *act;
|
autoCreateTuple *act;
|
||||||
gboolean autoCreateState, notifyState;
|
gboolean autoCreateState, notifyState;
|
||||||
Query *q, *dlQuery, *newQuery;
|
Query *q, *dlQuery, *newQuery;
|
||||||
|
int count;
|
||||||
|
|
||||||
q = xaccMallocQuery();
|
q = xaccMallocQuery();
|
||||||
gnc_suspend_gui_refresh();
|
gnc_suspend_gui_refresh();
|
||||||
|
count = 0;
|
||||||
|
gtk_progress_configure( sxsld->prog, 0, 0, g_list_length( autoCreateList ) );
|
||||||
for ( ; autoCreateList ; autoCreateList = autoCreateList->next ) {
|
for ( ; autoCreateList ; autoCreateList = autoCreateList->next ) {
|
||||||
thisGUID = createdGUIDs = NULL;
|
thisGUID = createdGUIDs = NULL;
|
||||||
act = (autoCreateTuple*)autoCreateList->data;
|
act = (autoCreateTuple*)autoCreateList->data;
|
||||||
@ -981,8 +1011,11 @@ process_auto_create_list( GList *autoCreateList, sxSinceLastData *sxsld )
|
|||||||
create_transactions_on( act->sx,
|
create_transactions_on( act->sx,
|
||||||
act->date,
|
act->date,
|
||||||
NULL, &createdGUIDs );
|
NULL, &createdGUIDs );
|
||||||
DEBUG( "created %d Transaction GUIDs",
|
|
||||||
g_list_length( createdGUIDs ) );
|
count += g_list_length( createdGUIDs );
|
||||||
|
gtk_progress_set_value( sxsld->prog, count );
|
||||||
|
while (g_main_iteration(FALSE));
|
||||||
|
|
||||||
sxsld->autoCreatedSomething = TRUE;
|
sxsld->autoCreatedSomething = TRUE;
|
||||||
if ( notifyState ) {
|
if ( notifyState ) {
|
||||||
for ( thisGUID = createdGUIDs;
|
for ( thisGUID = createdGUIDs;
|
||||||
@ -1000,6 +1033,9 @@ process_auto_create_list( GList *autoCreateList, sxSinceLastData *sxsld )
|
|||||||
g_list_concat( sxsld->createdTxnGUIDList,
|
g_list_concat( sxsld->createdTxnGUIDList,
|
||||||
createdGUIDs );
|
createdGUIDs );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
DEBUG( "Finished creating transactions; updating ledger" );
|
||||||
|
|
||||||
dlQuery = gnc_ledger_display_get_query( sxsld->ac_ledger );
|
dlQuery = gnc_ledger_display_get_query( sxsld->ac_ledger );
|
||||||
newQuery = xaccQueryMerge( dlQuery, q, QUERY_AND );
|
newQuery = xaccQueryMerge( dlQuery, q, QUERY_AND );
|
||||||
gnc_ledger_display_set_query( sxsld->ac_ledger, newQuery );
|
gnc_ledger_display_set_query( sxsld->ac_ledger, newQuery );
|
||||||
@ -1019,7 +1055,6 @@ add_to_create_list_to_gui( GList *toCreateList, sxSinceLastData *sxsld )
|
|||||||
if ( toCreateList == NULL )
|
if ( toCreateList == NULL )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
DEBUG( "foobar" );
|
|
||||||
clist = GTK_CLIST( glade_xml_get_widget( sxsld->gxml, TO_CREATE_CLIST ) );
|
clist = GTK_CLIST( glade_xml_get_widget( sxsld->gxml, TO_CREATE_CLIST ) );
|
||||||
for ( ; toCreateList ; toCreateList = toCreateList->next ) {
|
for ( ; toCreateList ; toCreateList = toCreateList->next ) {
|
||||||
tct = (toCreateTuple*)toCreateList->data;
|
tct = (toCreateTuple*)toCreateList->data;
|
||||||
@ -1239,7 +1274,7 @@ sxsincelast_populate( sxSinceLastData *sxsld )
|
|||||||
|
|
||||||
xaccSchedXactionGetAutoCreate( sx, &autocreateState,
|
xaccSchedXactionGetAutoCreate( sx, &autocreateState,
|
||||||
¬ifyState );
|
¬ifyState );
|
||||||
do {
|
for ( ; instanceList; instanceList = instanceList->next ) {
|
||||||
instDate = (GDate*)instanceList->data;
|
instDate = (GDate*)instanceList->data;
|
||||||
if ( autocreateState ) {
|
if ( autocreateState ) {
|
||||||
act = g_new0( autoCreateTuple, 1 );
|
act = g_new0( autoCreateTuple, 1 );
|
||||||
@ -1255,8 +1290,7 @@ sxsincelast_populate( sxSinceLastData *sxsld )
|
|||||||
sxsld->toCreateList =
|
sxsld->toCreateList =
|
||||||
g_list_append( sxsld->toCreateList, tct );
|
g_list_append( sxsld->toCreateList, tct );
|
||||||
}
|
}
|
||||||
} while ( (instanceList = instanceList->next) );
|
}
|
||||||
|
|
||||||
/* Report RE:showing the dialog iff there's stuff in it to
|
/* Report RE:showing the dialog iff there's stuff in it to
|
||||||
* show. */
|
* show. */
|
||||||
showIt |= (g_list_length( sxsld->autoCreateList ) > 0);
|
showIt |= (g_list_length( sxsld->autoCreateList ) > 0);
|
||||||
@ -1641,13 +1675,12 @@ create_transactions_on( SchedXaction *sx, GDate *gd,
|
|||||||
gboolean createdTCT;
|
gboolean createdTCT;
|
||||||
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
{
|
{
|
||||||
|
char tmpBuf[GNC_D_WIDTH];
|
||||||
g_date_strftime( tmpBuf, GNC_D_WIDTH, GNC_D_FMT, gd );
|
g_date_strftime( tmpBuf, GNC_D_WIDTH, GNC_D_FMT, gd );
|
||||||
DEBUG( "Creating transactions on %s for %s",
|
DEBUG( "Creating transactions on %s for %s",
|
||||||
tmpBuf, xaccSchedXactionGetName( sx ) );
|
tmpBuf, xaccSchedXactionGetName( sx ) );
|
||||||
}
|
}
|
||||||
#endif /* 0 */
|
|
||||||
|
|
||||||
if ( tct != NULL
|
if ( tct != NULL
|
||||||
&& g_date_compare( gd, tct->date ) != 0 ) {
|
&& g_date_compare( gd, tct->date ) != 0 ) {
|
||||||
|
@ -4613,6 +4613,57 @@ Anually
|
|||||||
<class>GnomeDruid</class>
|
<class>GnomeDruid</class>
|
||||||
<name>sincelast_druid</name>
|
<name>sincelast_druid</name>
|
||||||
|
|
||||||
|
<widget>
|
||||||
|
<class>GnomeDruidPageStandard</class>
|
||||||
|
<name>what_to_do</name>
|
||||||
|
<title>What to do, what to do?</title>
|
||||||
|
<title_color>255,255,255</title_color>
|
||||||
|
<background_color>25,25,112</background_color>
|
||||||
|
<logo_background_color>255,255,255</logo_background_color>
|
||||||
|
|
||||||
|
<widget>
|
||||||
|
<class>GtkVBox</class>
|
||||||
|
<child_name>GnomeDruidPageStandard:vbox</child_name>
|
||||||
|
<name>what_to_do_vbox</name>
|
||||||
|
<homogeneous>False</homogeneous>
|
||||||
|
<spacing>0</spacing>
|
||||||
|
<child>
|
||||||
|
<padding>0</padding>
|
||||||
|
<expand>True</expand>
|
||||||
|
<fill>True</fill>
|
||||||
|
</child>
|
||||||
|
|
||||||
|
<widget>
|
||||||
|
<class>GtkFrame</class>
|
||||||
|
<name>frame82</name>
|
||||||
|
<border_width>38</border_width>
|
||||||
|
<label>Creating transactions...</label>
|
||||||
|
<label_xalign>0.05</label_xalign>
|
||||||
|
<shadow_type>GTK_SHADOW_ETCHED_IN</shadow_type>
|
||||||
|
<child>
|
||||||
|
<padding>0</padding>
|
||||||
|
<expand>True</expand>
|
||||||
|
<fill>False</fill>
|
||||||
|
</child>
|
||||||
|
|
||||||
|
<widget>
|
||||||
|
<class>GtkProgressBar</class>
|
||||||
|
<name>creation_progress</name>
|
||||||
|
<value>0</value>
|
||||||
|
<lower>0</lower>
|
||||||
|
<upper>100</upper>
|
||||||
|
<bar_style>GTK_PROGRESS_CONTINUOUS</bar_style>
|
||||||
|
<orientation>GTK_PROGRESS_LEFT_TO_RIGHT</orientation>
|
||||||
|
<activity_mode>False</activity_mode>
|
||||||
|
<show_text>True</show_text>
|
||||||
|
<format>%v/%u (%p%%)</format>
|
||||||
|
<text_xalign>0.5</text_xalign>
|
||||||
|
<text_yalign>0.5</text_yalign>
|
||||||
|
</widget>
|
||||||
|
</widget>
|
||||||
|
</widget>
|
||||||
|
</widget>
|
||||||
|
|
||||||
<widget>
|
<widget>
|
||||||
<class>GnomeDruidPageStandard</class>
|
<class>GnomeDruidPageStandard</class>
|
||||||
<name>reminders_page</name>
|
<name>reminders_page</name>
|
||||||
|
Loading…
Reference in New Issue
Block a user