Sunday, August 31, 2014

Using Scheduled Workflows for Recurring / Periodic Tasks

While iFreeTools already has support for database-trigger based workflow execution, which can execute tasks like sending out email or SMS, adding of new records or editing existing records in database and for re-indexing records (to recompute formula field values), there can be automation scenarios wherein some workflows need to be triggered periodically, for a specific set of records.

Examples of such scenario can include,

  • sending out emails for birthdays,
  • sending an SMS when the expiry date is nearing,
  • recomputing formula fields of specific records (for example the formula field for Age can be recomputed for records which have Date of Birth on that day).

To enable automation for such scenarios, we have enabled support for Scheduled Workflows.

As a specific example, let us consider a subscriber database which needs to be notified about the upcoming renewal date for their subscription.

The actions to perform in this example, has an email configured to be sent to the subscribers about the upcoming renewal date, like shown below.


The full work-flow configuration for the sample scheduled workflow is given below, with the relevant sections highlighted in green.

Apart form normal workflow configuration details like Workflow NameDescriptionEntity and Status, for the Scheduled Workflow configuration, the Trigger During value needs to be specified as Schedule. The other non-relevant sections of the configuration page can be left with the default values.


Under the Schedule Setting section, we have specified the Schedule Interval to be Every Day, but since we want this to execute only on the 1st of every month, we add a Schedule Criteria Expression as day(now()) == 1 . On the other days, the expression will evaluate to false and will not fetch the records to execute the actions.

The Records To Fetch When Scheduled specifies that only the records which have the Renewal Date in the next month needs to be fetched, for which the specified actions will be executed.

All actions performed during the Scheduled Workflows will be audited under scheduled-workflow-user account.

Scheduled Workflows will be a premium feature available for paid customers. For efficient use of computing resources, the scheduling options will be disabled by default in the paid single-tenant deployments and can be enabled on request.

Hope you find this feature. Feel free to let us know your feedback on how we can enable more such automation for you.

Thursday, July 31, 2014

Enabling "Import" and "Unlock any record" permissions for non-admin users

Until now, we had restricted the ability to import data (as CSV files) and the ability to being able to unlock any of the locked records, to admin users alone. Due to the nature of these operations, we believed that  such a restriction would be necessary.

Some customers wanted to enable these permissions to trusted users, but at the same time did not want to provide full admin permissions, considering those users to be in an intermediate permission level. Based on their requests, we have now made it possible to enable non-admin users to import data and to be able to unlock any records using Auth Profiles.

While Import permission will be configurable for all entities in the Auth Profile form, the Unlock any record permission will be available for configuration only for entities which have record locking enabled.



Hope you find the new features useful. Feel free to let us know your feedback on how we can make things better for you in your online database application creator

Monday, June 30, 2014

Upload files of size up to 32 MB, in your online database

iFreeTools Creator, your online database application builder built for hosting on Google App Engine, has had support for image fields since the early days. These image fields used Google App Engine's datastore to store the files. Due to the design of the App Engine datastore, the maximum file size for these fields was limited to 1 MB. We had an automatic size-reduction enabled for these fields, to reduce the file sizes of the uploaded files. This field has been serving our free-users and our paid-customers well until now.

For bigger files, there was always the option of storing them within Google Drive and attaching the files from Google Drive to database records. But these attachments are treated different from the normal fields. So, some clients have been requesting support for bigger file uploads.

Based on a prioritization request from our client, we have now enabled support for bigger file uploads for our paid single-tenant deployment customers.

Paid deployments will now have an option to add new attributes with Image / File Upload (Big) data-type.



These new attributes will store the file contents in Google App Engine's blobstore. The blobstore allows files of sizes up to 32 MB to be uploaded, utilizing the 5 GB free blobstore quota, offered by Google for all Google App Engine applications.

Additional storage will be billed at $0.026/GB/month (payable to Google) :
https://developers.google.com/appengine/pricing#Billable_Resource_Unit_Costs

We have started rolling in this feature for our paid customers. If you are a paid customer of iFreeTools, you should see this feature available in your deployment very soon.

Do you have a feature request for iFreeTools that you want to be prioritized? Get in touch with us, so that we take this forward.

Tuesday, May 27, 2014

Attach files or folders from Google Drive to your database records

Following our recent back-end changes in iFreeTools, we are now glad to enhance our Google Docs attachment feature, to now support attaching any files/folder from within Google Drive.

Earlier, it was possible to attach limited file types alone from Google Docs (document, spreadsheet, presentation and PDF), like shown below :



With the recent upgrade and subsequent changes, we have moved to using latest version of Google services and have integrated with Google Drive API.

This has enabled us to allow attaching any of the files or folders from within Google Drive, including Microsoft file formats, Google drawings, standard images files and zip files.




The attached files or folders will get listed under the database record's details page.

Like in the earlier implementation, the attachment process does not duplicate the file contents, but creates an association with the database record within iFreeTools, so that you can access the latest version from within the record's details page. The sharing permissions configured for the file/folder in Google Drive will hence remain enforced.


Hope you like the new feature. Feel free to send in your feedback on how you think we can make things better for you in iFreeTools.

Wednesday, April 9, 2014

Back-end changes in iFreeTools

We have recently invested in migrating iFreeTools code to the latest computing environment on Google App Engine. As a result of these changes, iFreeTools is now able to utilize computing resources in a better way, than it was possible earlier.

The new version having these changes has already been rolled out in our free multi-tenant deployment, hosted at http://creator.ifreetools.com and we are in the progress of rolling this version for all single-tenant deployment customers.

What these back-end changes will mean for you :

If you are a user of the free multi-tenant deployment, you will be glad that we can serve more of the growing number of free applications. You may have also already experienced lesser latency than earlier, in the recent days.

If you are paid customer, using our single-tenant deployment option, you will be able serve more users with lower computing instance hours. This is now possible because each computing instance can handle more than one request at the same time (multi-threaded processing).

These back-end changes also enable other possibilities and new features, including some features which have been oft requested by our users. 

Keep following our blogs for more details on these new features.

Saturday, November 30, 2013

Assigning colors to database records, for use in Calender views

We have now enabled an option to show entries in calendar view with configurable background and text colors in your favorite online database builder.

To use this feature, you need to add 2 new attributes and provide them with aliases as backgroundColor and textColor. You can assign the colors directly in forms (selecting from a list of choice-values) or you can assign them automatically using formula.

When the calendar views are displayed, iFreeTools will check to see if there is an attribute with alias as backgroundColor and textColor within the record, and if so, it will use those attribute's values for the calendar rendering.

As an example, let us consider a database of issues, reported by customers. If the issue records had a Severity attribute, which can take values as Critical, Major, Minor, and Cosmetic and if we wanted to view the entries in the calendar, such that the background color is based on this Severity, using the following colors for those severity values :

Severity : CriticalMajorMinorCosmetic

Then, we can add formula attributes to set the required color values for the records, so that they are used in the calendar view. Our sample app to showcase this new feature will similar to the issue tracker application we had built in one of the earlier walk-through, with the following attributes :
  • Title attribute as Single-line Text.
  • Description attribute as Multi-line Text.
  • Steps to reproduce attribute as Multi-line Text.
  • Severity attribute as Multi-line Text with choice values Critical, Major, Minor, Cosmetic & alias as severity.
  • Background Color attribute as Single-line Text with alias as backgroundColor & formula expression as :
    switch(severity == "Critical", "red", severity == "Major","orange", severity == "Minor", "yellow", severity == "Cosmetic", "lightblue").
  • Text Color attribute as Single-line Text with alias as textColor & formula expression as :
    iif(severity == "Critical", "white", "black").
  • Status attribute as Single-line Text with choice value as New, Accepted, Closed & alias as status.
  • Tester attribute as Lookup field (Reference), with Refers To as User.
  • Date Logged attribute as Date with formula expression as :
     iif(dateLogged, dateLogged, today()).
  • Date Closed attribute as Date with formula expression as :
     iif(status == "Closed", iif(dateClosed, dateClosed, today()), None).
Now assuming we also wanted to mark the closed issue as green, the formula for Background Color can be changed to be similar to the one given below :

iif(status == "Closed", "green", switch(severity == "Critical", "red", severity == "Major", "orange", severity == "Minor", "yellow", severity == "Cosmetic", "lightblue"))

The configuration of the Attributes is given below for reference:



We can now proceed to add entries into the issue records and they would get assigned with background and text colors based on the formula expressions we have specified.

The following image shows the calender view with some sample entries having the configured background and text colors.


Existing entries will have to be re-indexed once (from under More Actions > Re-index, in the list views) to have the formula attributes updated.

Hope you like the new feature. Feel free to let us know your feedback and suggestions.

Tuesday, October 29, 2013

Specifying default values for form fields, using expressions

iFreeTools Creator, your easy web-based database software built for hosting on Google App Engine, now supports specifying default values for attributes in forms. The default values can be configured using the Default Value Expression in Attribute definition.


Expressions should return the result in the expected data-type. For details on using expressions, you may refer to our help docs.

Sample default value expression for each data type are given below:

Data Type

Examples

Single/Multi-line Text

  • "Velachery"
    Text values have to be provided within quotes.
  • val_from(user(), "Name")
    to set the currently logged-in user's name.
  • val_from(user(), "Email Id")
    to set the currently logged-in user's email-id.
Yes/No checkbox (Boolean)


  • True
  • False
  • val_from(user(),"Role") == "admin" to mark as Yes, if the current user has admin access.
Number Integer/Decimal numbers
  • 1
  • -2
  • 33.5
  • -44.75
  • val_from(fetch_one("Fee Details", "Year":year(), "Month":month()}), "Fees"))
    to fetch the values form an existing database record, in this case, from Fee Details entity, which matches the condition of having the Year attribute as the current year and the Month attribue as current month. From this matching record, we get the default-value from the Fees attribute.
Single line text - Choice Value

  • "Cash"
    Any of the choice values can be provided. For example, the above is valid if the choice values were : "Cheque", "Cash", "Bank Transfer"
Date
  • today()
  • today() + timedelta(5)
    to set the date value as 5 days from the current date.
Date and Time
  • now()
  • now() + timedelta(0,3600*10)
    to set the date-time value as 10 hours from the current date-time.
Image
  • key_id(val_from(fetch_one("Default Values",{}), "Default Profile Image"))
    to fetch the image form an existing database record, in this case, from Default Values entity, having an image-attribute with name as Default Profile Image.
Geographical Location (Geo Point)
  • "13.1207829,80.2377078" 
    in case you know the co-ordinates of a specific location, the value has to be provided within quotes.
  • val_from(fetch_one("Default Values",{}), "Default Location") 
    to fetch the location form an existing database record, in this case, from Default Values entity, having an geo-point-attribute with name as Default Location.
List (with string values)
  • ["English", "Spanish", "French"]
  • val_from(fetch_one("Default Values",{}), "Default Languages")
    to fetch the values from an existing database record, in this case, from Default Values entity, having an list-attribute with name as Default Languages.
Lookup field (Reference)
  • key_id(fetch_one("Teacher",{"Name":"John Smith"}))
    to fetch the values from an existing database record, in this case, from the Teacher entity, having Name as John Smith.

Hope you like our new feature. If you need assistance in using this feature or if you have suggestions, feel free to use the feedback form in our application.